题目:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
思路:类似最小覆盖子串,利用双指针+滑动窗口的思想,区别是这里内层while循环条件(match数等于needs大小)及判断是结果索引的条件(right-left等于p的大小)。
代码:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> res;
int lens=s.size();
//int lent=t.size();
int left=0,right=0;
unordered_map<char,int> needs;
unordered_map<char,int> window;
for(auto c:p){
needs[c]++;
}
int match=0;
while(right<lens){
char c1=s[right];
if(needs.count(c1)){
window[c1]++;
if(window[c1]==needs[c1]){
match++;
}
}
right++;
while(match==needs.size()){
if(right-left==p.size()){ //
res.push_back(left);
}
char c2=s[left];
if(needs.count(c2)){
window[c2]--;
if(window[c2]<needs[c2])
match--;
}
left++;
}
}
return res;
}
};
复杂度分析:时间复杂度为O(m+n),空间复杂度为O(m+n)。