题目描述
题目分析
模式识别1:涉及到次数,或者频率,可以使用哈希表进行存储。
模式识别2:涉及到字符串的匹配问题,可以考虑使用滑动窗口(双指针,两指针的距离恒定),提高效率。
说明:滑动窗口的初始值灵活多变,可以从(0, 0)开始,也可以从(0, 2)或者(0, 3)开始,只要保持好长度符合模板的长度,并且及时将窗口的左边界加入结果集即可,没有具体的要求,因此下面的代码仅供参考!
编程
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
// 排除特殊情况
if (p.size() > s.size() || s.empty()) {
return {};
}
// 初始化哈希表
vector<int> tem(26); // 模板
vector<int> windows(26); // 滑动窗口
vector<int> result;
// 初始化模板
for (char ch: p) {
tem[ch - 'a']++;
}
// 初始化滑动窗口的前两个元素
for (int i = 0; i < p.size() - 1; ++i) {
windows[s[i] - 'a']++;
}
// 初始化滑动窗口的边界
int left = 0, right = p.size() - 1;
while (right < s.size()) {
// 先统计滑动窗口右边界到滑动窗口哈希表中,满足模板p长度
// 然后右边界指针右移
windows[s[right++] - 'a']++;
// 模板匹配判断
if (windows == tem) {
result.emplace_back(left);
}
// 去除滑动窗口左边界的频率
// 然后左边界右移,保证整个窗口的长度维模板p的长度
windows[s[left++] - 'a']--;
}
return result;
}
};