题目描述
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
说明:
字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。
示例 1:
输入:
s: “cbaebabacd” p: “abc”
输出:
[0, 6]
解释:
起始索引等于 0 的子串是 “cba”, 它是 “abc” 的字母异位词。
起始索引等于 6 的子串是 “bac”, 它是 “abc” 的字母异位词。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
C++
class Solution {
public:
/*滑动窗口:左闭右开*/
vector<int> findAnagrams(string s, string p) {
unordered_map<char,int> need,window;
vector<int> res; //返回值
for(char c:p) need[c]++;
int left=0;
int right=0;
int valid=0;
while(right<s.size()){
char c=s[right];
right++;//窗口向右扩展
//窗口变化就更新值
if(need.count(c)){
window[c]++;
if(need[c]==window[c]){
valid++;
}
}
//判断是否找到解了
while(right-left>=p.size()){
if(valid==need.size()){
res.push_back(left); //找到解
}
//很可能窗口内的字符串多了,判断是否需要左移
char d=s[left];
left++;
if(need.count(d)){
if(need[d]==window[d])
valid--;
window[d]--;
}
}
}
return res;
}
};