🧩Algo 滑动窗口
438. 找到字符串中所有字母异位词
难度:🟡 Medium | 标签:滑动窗口、哈希、字符串 | 状态:⬜ LeetCode 链接
思路
固定长度滑窗(窗口大小 = p.size()),用 26 长计数数组比较。
每次窗口右滑:右端加入、左端弹出,O(26) 判断是否相等。
代码
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int n = s.size(), m = p.size();
vector<int> res;
if (n < m) return res;
int cs[26] = {}, cp[26] = {};
for (int i = 0; i < m; ++i) {
cs[s[i] - 'a']++;
cp[p[i] - 'a']++;
}
auto eq = [&] { return memcmp(cs, cp, sizeof cs) == 0; };
if (eq()) res.push_back(0);
for (int r = m; r < n; ++r) {
cs[s[r] - 'a']++;
cs[s[r - m] - 'a']--;
if (eq()) res.push_back(r - m + 1);
}
return res;
}
};
复杂度
- 时间 O(n · 26) = O(n),空间 O(1)
易错 / 回顾
- 窗口长度固定 =
p.size(),不能像变长滑窗那样动左 memcmp比手写循环更快- 不要逐次重新统计窗口,必须增量更新
Related · 滑动窗口