【题干】
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。
【思路】
考虑到需要反复比较,使用hashmap降低比较成本。
(1)使用第一个表记录p的内容。
(2)使用第二个表记录s中当前正在被比较子串的内容:首先依次将当前位置的字符添加到表中的编码顺序位置(通过ASCII码与“a”相减获得),直到map中记录的字符数量与p相同
(3)后续每一轮,在表中删去当前子串的第一个字符位置计数并重新添加后续第一个字符位置计数。
(4)在每轮循环操作结束后比较两个哈希表是否相等,相等则记录当前子串起始下标。
【题解】
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int n = s.size(), m = p.size();
if (n < m) return {};
vector<int> maps(26);
vector<int> mapp(26);
for(auto& c : p) {
mapp[c - 'a']++;
}
vector<int> ans;
for(int i = 0;i < n;i++) {
maps[s[i] - 'a']++;
if(i >= m - 1) { // 当前的maps中元素已经达到m个
if (mapp == maps) ans.push_back(i - m + 1);
maps[s[i - m + 1] - 'a']--;
}
}
return ans;
}
};