LeetCode 438. 找到字符串中所有字母异位词
原题链接
中等
C++ 代码
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int eff = 0, len = p.size(); // eff为
int hash1[26] = {0}; // 存放p字符串
int hash2[26] = {0}; // 存放滑动串口出现的每个字符
vector<int> indexs;
for(auto c:p) hash1[c - 'a']++;
for(int left = 0, right = 0; right < s.size(); ++right)
{
// 将s字符串存入hash2,值+1
// 如果值小于相应的hash1,说明字符相同,有效字符+1
if(++hash2[s[right] - 'a'] <= hash1[s[right] - 'a'])++eff;
// 滑动串口达到p字符串长度时作比较
if(right - left + 1 > len)
{
// 还没有更新前hash2[s[left] - 'a']肯定是大于1的;
// 下面if成立的话,说明该s[left]字符一定在p中出现过,所以有效字符减一
if(hash2[s[left] - 'a'] -- <= hash1[s[left] - 'a']) --eff;
// 左指针前移
++left;
}
// 有效字符刚好等于p字符长度,则说明该滑动窗口的子串是p的异位串
if(eff == len)indexs.push_back(left);
}
return indexs;
}
};