LeetCode 热题100——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 * 10^4s和p仅包含小写字母核心思想由于字符串只包含小写字母可以用长度为26的数组来记录每个字母出现的次数。判断两个字符串是否为异位词。我们用一个长度等于p.size()的滑动窗口在s上移动维护窗口内字母的计数数组。每次移动窗口后比较当前窗口的计数数组与p的计数数组是否相等若相等则记录窗口起始索引。答案class Solution { public: vectorint findAnagrams(string s, string p) { vectorint ans; //如果不定义vector用普通的数组比较的是地址不是内容vector 重载了 运算符可以直接比较内容。记得数组初始化为0 vectorint scount(26,0); vectorint pcount(26,0); if(s.size()p.size()) return vectorint (); //初始化第一个窗口 for(int i0;ip.size();i){ scount[s[i]-a]; pcount[p[i]-a]; } if(scountpcount) ans.push_back(0); //滑动窗口 for(int i0;is.size()-p.size();i){ scount[s[i]-a]--;//移除左边界值 scount[s[ip.size()]-a];//加入右边界新字符 if(scountpcount) ans.push_back(i1); } return ans; } };要点为什么用 vectorint 而不是普通数组普通数组名 int[26] 比较时退化为指针比较的是地址而非内容无法直接判断两个数组是否相等。而 vectorint 重载了 运算符可以逐元素比较。数组必须初始化为 0vectorint(26, 0) 保证所有计数从 0 开始。字符转下标s[i] - a将小写字母映射到 0~25 的整数。