这道题主要考察的是快慢指针实现滑动窗口的思想以及对字符串数组索引处理的方法
此题相关题目:
- 383.赎金信
- 49.字母异位词分组
- 438.找到字符串中所有字母异位词
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
// 用两个数组分别记录s和p中每一个字母出现的次数
int h1 [26] = {0} , h2 [26] = {0};
//遍历p字符串并统计所有出现过的字母的次数
for(int i = 0;i < p.length() ;i ++){
h2[p[i] - 'a']++;
}
//存结果
vector<int> res;
//利用快慢指针滑动窗口 遍历s字符串并统计所有出现过的字母的次数
for( int slow = 0,fast = 0 ; fast < s.size() ; fast ++){
h1[s[fast] - 'a']++;
//若窗口里某个字符数量比p多了 所以要移动位置 这里不用考虑是否会出现p中没出现过的字母和s比较的问题 因为while循环里只比较p中含有的字符
while(h1[s[fast] - 'a'] > h2[s[fast] - 'a']){
//因为要向右移一位 多出的字母就少一个了
h1[s[slow] - 'a']--;
//慢指针右移
slow ++;
}
//在以上条件都满足的情况下 如果长度都相等了 就把慢指针的索引加入结果数组
if(fast - slow + 1 == p.size())
res.push_back(slow);
}
return res;
}
};
此题相关题目:
- 383.赎金信
- 49.字母异位词分组
- 438.找到字符串中所有字母异位词
新晋小白 比较菜 有什么问题欢迎大佬们批评指正!