LeetCode 438 找到字符串中所有字母异位词
438. 找到字符串中所有字母异位词
解题思路:
设字符串p的长度为k,在字符串s上维护一个大小为k的滑动窗口。判断滑动窗口里的字符串和p是否是异位词。通过统计字符串P中每一个字符出现的次数来判断单词是否是异位词。利用哈希表来记录每个单词出现的次数,当滑动窗口移动的时候注意更新移除窗口的单词的出现个数。
代码:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> ans;
if (s.size() < p.size()) return ans;
int k = p.size(), n = s.size(); //维护一个大小为k的滑动窗口
vector<int> s_table(26);
vector<int> p_table(26);
for (int i = 0; i < k; ++ i) {
++s_table[s[i] - 'a'];
++p_table[p[i] - 'a'];
}
if (s_table == p_table) ans.emplace_back(0);
for (int i = k; i < n; ++ i) {
--s_table[s[i - k] - 'a'];
++s_table[s[i] - 'a'];
if (s_table == p_table) ans.emplace_back(i - k + 1);
}
return ans;
}
};