LeeCode 438.找到字符串中所有字母异位词.

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

输入: s = “cbaebabacd”, p = “abc”
输出: [0,6]
解释:
起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。
起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词。

示例 2:

输入: s = “abab”, p = “ab”
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 “ab”, 它是 “ab” 的异位词。
起始索引等于 1 的子串是 “ba”, 它是 “ab” 的异位词。
起始索引等于 2 的子串是 “ab”, 它是 “ab” 的异位词。

提示:

1 <= s.length, p.length <= 3 * 104
s 和 p 仅包含小写字母

1.滑动窗口,出现频率

思路:

  1. 字符串 sss 中构造一个长度为与字符串 p 的长度相同的滑动窗口
  2. 构建字母出现的频率表,比较出现频率
class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> ans = new ArrayList<Integer>();int sLen = s.length(), pLen = p.length();if(s == null || p == null || sLen < pLen) {return ans;}// 构建字母出现的频率表int[] sCount = new int[26];int[] pCount = new int[26];//第一次for (int i = 0; i<pLen; i++) {sCount[s.charAt(i) - 'a']++;pCount[p.charAt(i) - 'a']++;}if(Arrays.equals(sCount, pCount)) {ans.add(0);}for (int i = 0; i < sLen - pLen; i++) {// 左侧将要划出,减去一次sCount[s.charAt(i) - 'a']--;// 右侧滑入,增加一次sCount[s.charAt(i + pLen) - 'a']++;// 再次比较频率表if(Arrays.equals(sCount, pCount)) {ans.add(i+1);}}return ans;}
}

执行用时分布
8ms
击败71.71%使用 Java 的用户
消耗内存分布
43.79MB
击败37.70%使用 Java 的用户

2.滑动窗口,反向思维

class Solution {public List<Integer> findAnagrams(String s, String p) {ArrayList<Integer> ans = new ArrayList<>();if (s.length() < p.length()) return ans;int[] counts = new int[26]; // 欠账表:欠的字符 -> 欠的个数int all = p.length(); // 总欠账数目// 统计欠账,生成欠账表:for (char c : p.toCharArray()) counts[c-'a']++;// 【滑动窗口】还账:int l = 0, r = 0, n = s.length();char[] str = s.toCharArray();for (; l < n; l++) {// 窗口右边界字符进入窗口还账,如果不超额还账,就一直还:while (r < n && counts[str[r] - 'a'] > 0) {all--;counts[str[r++] - 'a']--;}// 还账结束,看当前窗口内是否还清了所有欠账:if (all == 0) ans.add(l);// 窗口左边界字符出窗口,重新赊账:counts[str[l] - 'a']++;all++;}return ans;}
}

执行用时分布
3ms
击败99.94%使用 Java 的用户
消耗内存分布
43.63MB
击败47.83%使用 Java 的用户

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/647023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery练习

jquery练习 1.多图片展示 <!doctype html> <html> <head> <meta charset"utf-8"> <title>多图片展示效果</title> <link href"zns_style.css" rel"stylesheet" type"text/css" /> <sc…

从 Apk 提取代码到单独 dex

从 Apk 提取代码到单独 dex Android 中动态加载是指应用程序在运行时加载和执行 Dex 文件的过程&#xff0c;可以在运行时加载不同的代码或功能&#xff0c;而无需重新编译整个应用程序&#xff0c;动态加载 Dex 文件通常涉及以下步骤&#xff1a; 创建 Dex 文件 我们接触到的…

Redis的五种常用数据类型详解及相关面试问题

目录 Redis的五种常用数据类型详解 简述 Redis五种基本数据类型 String字符串 常用命令 应用场景 Hash散列表 常用命令 使用场景 List链表 常用命令 应用场景 Set( 集合) 常用命令 应用场景 SortedSet( 有序集合) zset 常用命令介绍 应用场景 面试题常问的数…

【Pytorch 第一讲】 如何加载预训练模型

一. 封装Pytorch的Model 加载pre-trianed Model import torch import torchvision.models as models from torchvision import transforms# 1. 下载并加载预训练模型 model models.resnet18(pretrainedFalse) # 设置pretrainedFalse&#xff0c;表示不加载预训练权重# 2. 下载…

退货通知单下推销售退货单,无法下推问题排查

文章目录 退货通知单下推销售退货单&#xff0c;无法下推问题排查报错界面排查原因 退货通知单下推销售退货单&#xff0c;无法下推问题排查 报错界面 排查 检验单已做。 原因 合格未勾选判退。

按键协管指南针加速计陀螺仪GPS等原理图纸2

1.imu电路。 加速计包含重力感应。 到传感器芯片u8, U16, U18的信息都是用的spi接口&#xff0c;如下图所示。OSCAR_TO_IMU_SPI_SCLK_FL, IMU_TO_OSCAR_SPI_MISO_FL, OSCAR_TO_IMU_SPI_MOSI_FL接了u8, u16, u18,通过片选信号cs选择哪个芯片接收。 加速计&#xff0c;陀螺仪&…

Redash 默认key漏洞(CVE-2021-41192)复现

Redash是以色列Redash公司的一套数据整合分析解决方案。该产品支持数据整合、数据可视化、查询编辑和数据共享等。 Redash 10.0.0及之前版本存在安全漏洞&#xff0c;攻击者可利用该漏洞来使用已知的默认值伪造会话。 1.漏洞级别 中危 2.漏洞搜索 fofa "redash"…

289. 生命游戏

根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 &am…

【ASP.NET Core 基础知识】--数据库连接--使用Entity Framework Core进行数据库访问

一、介绍 Entity Framework Core&#xff08;简称EF Core&#xff09;是微软推出的一个轻量级版的Entity Framework&#xff0c;它是一个开源的、跨平台&#xff08;Windows、Linux和macOS&#xff09;的对象关系映射&#xff08;ORM&#xff09;框架。EF Core 旨在提供快速的…

主播考核体系相关基础

1.主播薪资类型 2.主播考核体系 1.分为日常考核、月度考核 日常考核分为三部曲&#xff1a;播前、播中、播后 &#xff08;1&#xff09;播前 &#xff08;2&#xff09;播中 &#xff08;3&#xff09;播后 月度考核 月度考核表列举 主播等级划分要素 主播晋升考核方…

JVM篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、堆(Heap-线程共享) -运行时数据区二、方法区/永久代(线程共享)三、JVM 运行时内存四、新生代前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看…

Java面试题(5)

22.Iterator如何使用&#xff0c;有什么特点 java中的Iterator功能比较见到你&#xff0c;并且只能单向移动 1. iterator()&#xff1a;要求容器返回一个Iterator 2. next():用于获取序列的下一个元素&#xff08;第一次调用获取第一个元素&#xff09; 3. hasNext()&#xff…

Qt6入门教程 11:父子对象关系

在上一篇中的纯手写部分&#xff0c;不管是创建菜单、工具栏还是状态栏&#xff0c;我们new完之后都未显式的调用delete进行销毁&#xff0c;这样难道不会有内存泄漏么&#xff1f; QMenuBar *menuBar new QMenuBar(this); QToolBar *toolBar new QToolBar(this); QStatusBa…

web前端之不一样的居中方式、解决tabBar选项卡居中问题、css支持嵌套、auto

MENU 前言htmlstyle效果 前言 这里不能使用justify-content: center;&#xff0c;因为在小屏幕上&#xff0c;这种方式无法显示最前面的两个tabBar。 html <div id"box" class"d_f o_a mt_50 mb_50 ml_20 mr_20"><div class"ws_n">…

【MySQL】如何通过DDL去创建和修改员工信息表

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-fmKISDBsFq74ab2Z {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【vue】Vue2和Vue3中的代码逻辑复用对比(mixins、自定义hook):

文章目录 一、前言&#xff1a;二、mixins&#xff1a;【1】mixins是什么&#xff1f;【2】mixins如何使用&#xff1f;【3】mixins的一些特性&#xff1a;【4】mixins的缺点&#xff1a; 三、hook&#xff1a;【1】Vue3.x中的自定义hook函数是什么&#xff1f;【2】mixins和Co…

4.【SpringBoot3】文章管理接口开发

序言 在文章管理模块&#xff0c;有以下接口需要开发&#xff1a; 新增文章文章列表&#xff08;条件分页&#xff09;获取文章详情更新文章删除文章 数据库表字段和实体类属性&#xff1a; 1. 新增文章 需求分析 当用户点击左侧菜单中的“文章管理”后&#xff0c;页面主…

[EFI]HP EliteDesk 800 G6 Mini PC电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 HP EliteDesk 800 G6 Mini PC 处理器 Intel Core i5 10500 已驱动内存16GB 2667MHz DDR4已驱动硬盘SSD NVMe KINGSTON SNVS500G 500GB已驱动显卡Intel UHD Graphics 630已驱动声卡Realtek ALC222已驱动网卡Intel(R) Ethernet Connection (10) I219-LM已驱…

vue 点击按钮跳转另一个项目的链接地址,从另一个项目返回回来页面怎么让他刷新

如果你在 Vue 3 中点击按钮跳转到另一个项目的链接地址&#xff0c;然后从另一个项目返回时想要刷新页面&#xff0c;这就涉及到不同域的页面之间的通信问题。因为跨域的限制&#xff0c;返回的页面无法直接刷新原始页面。 一种解决方法是在跳转到另一个项目的链接地址时&…

腾讯云短信服务密钥信息

public IActionResult TestMessage() { // 腾讯云短信服务密钥信息 string secretId "-------------------------- "; string secretKey “---------------------------”; /* 必要步骤&#xff1a;* 实例化一个认证对象&#xff0c;入参需要传入腾讯云账户密钥对s…