LeetCode HOT100 - 找到字符串中所有字母异位词
异位词就是长度相同的字符串中各个字母的出现次数相同
因为 p 的长度是固定的
而且 s 的长度是 \(3*10^4\) ,因此不妨直接遍历 s 的起点,判断从它开始的子串是否满足我们的要求,O(n) 是可以接受的
每次移动,相应把对应字符删除/增加到计数器中
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> cnt0(26, 0);
int n = s.size();
for (int i = 0; i < p.size(); i++) {
cnt0[p[i] - 'a']++;
}
vector<int> cnt(26, 0);
vector<int> ans;
if (s.size() < p.size()) {
return ans;
}
for (int i = 0; i < p.size(); i++) {
cnt[s[i] - 'a']++;
}
int l = 0, r = p.size();
for (r; r < n;) {
if (cnt == cnt0) {
ans.emplace_back(l);
}
cnt[s[l++] - 'a']--;
cnt[s[r++] - 'a']++;
}
if (cnt == cnt0) {
ans.emplace_back(l);
}
return ans;
}
};

浙公网安备 33010602011771号