思路:滑动窗口 + 数组

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++ (滑动窗口 + 数组)相关推荐

  1. 【LeetCode】【HOT】438. 找到字符串中所有字母异位词(滑动窗口)

    [LeetCode][HOT]438. 找到字符串中所有字母异位词 文章目录 [LeetCode][HOT]438. 找到字符串中所有字母异位词 package hot;import java.uti ...

  2. LeetCode 438. 找到字符串中所有字母异位词(滑动窗口)

    1. 题目 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100 ...

  3. LeetCode 438. 找到字符串中所有字母异位词(双指针+滑动窗口)

    题目描述 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. ...

  4. 力扣438.找到字符串中所有字母异位词(JavaScript)

    var findAnagrams = function(s, p) {let n=s.lengthlet m=p.lengthlet number=new Array()let a='a'.charC ...

  5. 438. 找到字符串中所有字母异位词【我亦无他唯手熟尔】

    438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 题解 官方 438. 找到字符串中所有字母异位词 难度 中等 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 ...

  6. 438. 找到字符串中所有字母异位词【异位词-哈希数组】

    438. 找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引.不考虑答案输出的顺序. 异位词 指由相同字母重排列形成的字符串(包括 ...

  7. Java实现 LeetCode 438 找到字符串中所有字母异位词

    438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p ...

  8. leetcode刷题(91)——438. 找到字符串中所有字母异位词

    给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: ...

  9. leetcode 438. Find All Anagrams in a String | 438. 找到字符串中所有字母异位词(Java)

    题目 https://leetcode.com/problems/find-all-anagrams-in-a-string/ 题解 方法1:尝试构造一种"与顺序无关的哈希" 思考 ...

  10. 【解题报告】Leecode 438. 找到字符串中所有字母异位词——Leecode每日一题系列

    今天是坚持每日一题打卡的第二十七天 题目链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/ 题解汇总:https:// ...

最新文章

  1. 【转载】在服务器上用Fiddler抓取HTTPS流量
  2. 华为2018届校招技术岗笔试题及个人解答
  3. 数据标注、模型调参debug...通通自动化!华为云AI开发集大成之作ModelArts 2.0发布...
  4. 《软件工程方法与实践》—— 导读
  5. 实验12:引用外部属性文件★(spring管理连接池);
  6. 树状数组(单点+区间的所有操作)
  7. webService学习5:Eclipse的TCP/IP工具
  8. Python中的装饰器,迭代器,生成器
  9. PAT甲题题解-1001. A+B Format (20)-字符串处理,水
  10. ***CI查询辅助函数:insert_id()、affected_rows()
  11. Java排序算快速排序_Java排序算法 [快速排序]
  12. 火星云分发全网视频_好用的短视频一键分发软件,让工作效率提高10倍
  13. java csv 导出_java实现CSV文件输出
  14. 完全自定义TabBar(八)
  15. FreeSWITCH折腾笔记3——数据库修改为postgresql
  16. php字库,TCPDF生成内置字库的PDF
  17. Profinet与GSD文件
  18. 笔记总结-相机标定(Camera calibration)原理、步骤
  19. Ubuntu 安装rabbitvcs
  20. mysql视图创建以及权限

热门文章

  1. 安卓初学者笔记(四):用白话讲明白Activity是什么
  2. 利用线性回归进行销售预测
  3. 2021CentOS7系统Gnome3桌面使用Fcitx
  4. 学金融离不开计算机,如何看待学计算机的被学金融的鄙视
  5. 企鹅的java游戏_那只小企鹅终究要和我们告别了,腾讯又两款游戏宣布停运
  6. 腾创秒会达MHD-CHD40A 20倍光学变焦摄像机
  7. 万字总结Linux内核过滤框架(Nftables)
  8. 当Top-k遇到深度学习
  9. 利用vbs 运行程序 并使窗口隐藏
  10. Windows环境下搭建Redis集群