438. 找到字符串中所有字母异位词

438. 找到字符串中所有字母异位词_字符串

最优解:滑动窗口优化。

可用一个大小为 ∑ \sum ∑的数组表示两个字符串对应的字母的差值,然后用一个 d i f dif dif变量维护不相同的字母个数。

每次维护 0 → ± 1 0\rightarrow \pm 1 0→±1 的 d i f dif dif变化,然后通过 d i f dif dif来判断是否相等即可。

class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int sLen = s.size(), pLen = p.size();

if (sLen < pLen) {
return vector<int>();
}

vector<int> ans;
vector<int> count(26);
for (int i = 0; i < pLen; ++i) {
++count[s[i] - 'a'];
--count[p[i] - 'a'];
}

int differ = 0;
for (int j = 0; j < 26; ++j) {
if (count[j] != 0) {
++differ;
}
}

if (differ == 0) {
ans.emplace_back(0);
}

for (int i = 0; i < sLen - pLen; ++i) {
if (count[s[i] - 'a'] == 1) { // 窗口中字母 s[i] 的数量与字符串 p 中的数量从不同变得相同
--differ;
} else if (count[s[i] - 'a'] == 0) { // 窗口中字母 s[i] 的数量与字符串 p 中的数量从相同变得不同
++differ;
}
--count[s[i] - 'a'];

if (count[s[i + pLen] - 'a'] == -1) { // 窗口中字母 s[i+pLen] 的数量与字符串 p 中的数量从不同变得相同
--differ;
} else if (count[s[i + pLen] - 'a'] == 0) { // 窗口中字母 s[i+pLen] 的数量与字符串 p 中的数量从相同变得不同
++differ;
}
++count[s[i + pLen] - 'a'];

if (differ == 0) {
ans.emplace_back(i + 1);
}
}

return ans;
}
};