力扣438. 找到字符串中所有字母异位词 C++ (滑动窗口 + 数组)
思路:滑动窗口 + 数组
1.因为字符串中的字符全是小写字母,可以用长度为26的数组记录字母出现的次数。
2.plen =p.size(),记录p字符串的字母频次pcount,和s字符串前plen个字母频次(滑动窗口)scount。 若pcount和scount相等,则找到第一个异位词索引 0。
3.继续遍历s字符串,在scount中每次增加一个新字母s[i+plen],去除一个旧字母s[i]。
4.判断pcount和scount是否相等,相等则在返回值res中添加索引位置 i + 1。
class Solution {public:vector<int> findAnagrams(string s, string p) {int plen =p.size(),slen=s.size();if(slen<plen) {return vector<int>();}//s的长度小于字符串 p的长度时,返回空vector//一定要考虑到特殊情况,不加的话,scount下标会出现负值,报错。vector<int> res; //存答案vector<int> pcount(26);vector<int> scount(26);//利用滑动窗口,来对比s子串与p是否相同for(int i=0;i<plen;i++){//记录p各字母数量,同时与s从0开始第一个滑动窗口对比(妙,否则要另遍历s滑动窗口)pcount[p[i]-'a']++; //注意是p[i],不是s[i],也不是iscount[s[i]-'a']++;}if(pcount==scount) res.push_back(0);for(int i=0;i<slen-plen;i++){//s的滑动窗口依次后移,对比scount[s[i]-'a']--;scount[s[i+plen] -'a']++;if(pcount==scount) res.push_back(i+1);//注意索引位置为i+1}return res;}
};
注意:
1.滑动窗口真的很妙!!!
2.通过数组判断s 中所有p的异位词的子串!!但是要注意,使用数组来做哈希的题目,是因为题目都限制了数值的大小。
3.要考虑slen<plen特殊情况
复杂度分析
时间复杂度:O(n),for循环有O(n),数组的长度是常数,所以数组的比较也是常数级别的,那最终的时间复杂度就是O(n)。
空间复杂度:O(1),需要常数级别的额外空间。
力扣438. 找到字符串中所有字母异位词 C++ (滑动窗口 + 数组)相关推荐
- 【LeetCode】【HOT】438. 找到字符串中所有字母异位词(滑动窗口)
[LeetCode][HOT]438. 找到字符串中所有字母异位词 文章目录 [LeetCode][HOT]438. 找到字符串中所有字母异位词 package hot;import java.uti ...
- LeetCode 438. 找到字符串中所有字母异位词(滑动窗口)
1. 题目 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100 ...
- LeetCode 438. 找到字符串中所有字母异位词(双指针+滑动窗口)
题目描述 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. ...
- 力扣438.找到字符串中所有字母异位词(JavaScript)
var findAnagrams = function(s, p) {let n=s.lengthlet m=p.lengthlet number=new Array()let a='a'.charC ...
- 438. 找到字符串中所有字母异位词【我亦无他唯手熟尔】
438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 题解 官方 438. 找到字符串中所有字母异位词 难度 中等 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 ...
- 438. 找到字符串中所有字母异位词【异位词-哈希数组】
438. 找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引.不考虑答案输出的顺序. 异位词 指由相同字母重排列形成的字符串(包括 ...
- Java实现 LeetCode 438 找到字符串中所有字母异位词
438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p ...
- leetcode刷题(91)——438. 找到字符串中所有字母异位词
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: ...
- leetcode 438. Find All Anagrams in a String | 438. 找到字符串中所有字母异位词(Java)
题目 https://leetcode.com/problems/find-all-anagrams-in-a-string/ 题解 方法1:尝试构造一种"与顺序无关的哈希" 思考 ...
- 【解题报告】Leecode 438. 找到字符串中所有字母异位词——Leecode每日一题系列
今天是坚持每日一题打卡的第二十七天 题目链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/ 题解汇总:https:// ...
最新文章
- 【转载】在服务器上用Fiddler抓取HTTPS流量
- 华为2018届校招技术岗笔试题及个人解答
- 数据标注、模型调参debug...通通自动化!华为云AI开发集大成之作ModelArts 2.0发布...
- 《软件工程方法与实践》—— 导读
- 实验12:引用外部属性文件★(spring管理连接池);
- 树状数组(单点+区间的所有操作)
- webService学习5:Eclipse的TCP/IP工具
- Python中的装饰器,迭代器,生成器
- PAT甲题题解-1001. A+B Format (20)-字符串处理,水
- ***CI查询辅助函数:insert_id()、affected_rows()
- Java排序算快速排序_Java排序算法 [快速排序]
- 火星云分发全网视频_好用的短视频一键分发软件,让工作效率提高10倍
- java csv 导出_java实现CSV文件输出
- 完全自定义TabBar(八)
- FreeSWITCH折腾笔记3——数据库修改为postgresql
- php字库,TCPDF生成内置字库的PDF
- Profinet与GSD文件
- 笔记总结-相机标定(Camera calibration)原理、步骤
- Ubuntu 安装rabbitvcs
- mysql视图创建以及权限