Leetcode热题100-438 找出字符串中所有字母异位数
Leetcode热题100-438 找出字符串中所有字母异位数
- 1. 题目描述
- 2. 解题思路
- 3. 代码实现
1. 题目描述
438 找出字符串中所有字母异位数
2. 解题思路
该题所用到的算法为定长字符串滑动窗口, 其中窗口的大小为字符串p的长度:
- 定义两个无序哈希表window、need,其中window表示当前窗口内的元素,need表示需要匹配的字符串;
- 从左到右依次遍历字符串s,依次将当前字符加入window中,当当前窗口大小恰好等于字符串p的长度时,判断window与need是否一致,若一致则left放入结果res中;
- 当前窗口左边界右移,并将s[left]移出当前窗口;
- 按照2、3步骤依次遍历字符串s。
3. 代码实现
class Solution {
public:
// 定长滑动窗口,窗口的大小为字符串p的长度
vector<int> findAnagrams(string s, string p) {
// 用以保存最终结果
vector<int> res;
unordered_map<char, int> need, window;
for (auto ch : p) {
need[ch]++;
}
int left = 0, right = 0;
while (right < s.size()) {
char c = s[right++];
if (need.count(c)) {
window[c]++;
}
// 恰好等于窗口的大小时,判断该窗口是否合理
if (right - left == p.size()) {
if (window == need) {
res.push_back(left);
}
char d = s[left++];
if (need.count(d)) {
window[d]--;
}
}
}
return res;
}
};