题目大意:在字符串s中找出字符串p的所有字母异位词的首字母下标(字母相同,排列不同的字符串)
分析:滑动窗口双指针+哈希表。类似leetcode76。遇到子串匹配的问题基本就用滑动窗口解决。
leetcode76:s中找到最短子串,使得包含p中所有字母。
本题:s中找到与p长度相同的子串,使得包含p中所有字母。所以只需要再76的基础上改动,不需要维护最小长度了。当找到满足76的子串时,只需要再满足子串长度和p相同即可加入答案。
代码:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
unordered_map<char,int> dic;
vector<int> ans;
int count = p.length();
for (int i = 0;i < count;i++) {
dic[p[i]]++;
}
int left = 0;
for (int right = 0; right < s.length(); right++) {
char val = s[right];
if (dic.count(val)) {
dic[val]--;
if (dic[val] >= 0) {
count--;
}
}
while (count == 0) {
if(right - left + 1 == p.size()){
ans.push_back(left);
}
char temp = s[left];
if (dic.count(temp) != 0) {
dic[temp]++;
if (dic[temp] > 0) count++;
}
left++;
}
}
return ans;
}
};