438. 找到字符串中所有字母异位词 - 力扣(LeetCode)
字母异位词其实就是排列的意思,所以这题基本就是这2题的扩展版本:
leetcode 第 567 题:字符串的排列(C++)_qq_32523711的博客-CSDN博客
leetcode 第 76 题:最小覆盖子串(C++)_qq_32523711的博客-CSDN博客
连思路都是完全一样的,典型的滑动窗口法,只不过这儿我们需要返回子串的索引而已。
就不写分析了,真的特别像。
个人还是更喜欢只使用一个哈希表
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
unordered_map<char, int> need;
for(auto c : p) ++need[c];
int left = 0, right = 0;
int count = 0; //记录需要查全的字符个数
vector<int> res; //记录答案
while(right < s.size()){
auto c = s[right];
++right;
if(need.count(c) > 0){
--need[c];
if(need[c] == 0) ++count;
}
if(right - left == p.size()){//区间大小相同
if(count == need.size()) res.push_back(left);
auto d = s[left];
++left;
if(need.count(d)){
if(need[d] == 0) --count;
++need[d];
}
}
}
return res;
}
};
哈希表也可以改为两个数组或者一个数组,执行效率应该能提升不少,这儿就不写了,照着贴的那几个改就完事了。