题目链接:leetcode.
依然是滑动窗口,窗口大小是固定的,每次移去最左边并加上最右边,用diff记录当前窗口中s的cnt与p的cnt之间的不同,当diff为0时说明找到了
思路与567. 字符串的排列有些类似,就是注意最后是再比较以下以s[n-1]为结尾的窗口是不是符合条件就好啦(当然也可以不这样写
/*
执行用时:8 ms, 在所有 C++ 提交中击败了97.09%的用户
内存消耗:8.5 MB, 在所有 C++ 提交中击败了62.63%的用户
*/
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
if(s.size() < p.size())
return {};
vector<int> cnt(26, 0);
vector<int> ans;
for(int i = 0;i < p.size();++i)
{
cnt[p[i] - 'a']++;
cnt[s[i] - 'a']--;
}
int diff = 0;
for(auto x : cnt)
{
if(x != 0)
diff++;
}
for(int i = p.size();i < s.size();++i)
{
if(!diff)
ans.emplace_back(i - p.size());
char x = s[i - p.size()];
char y = s[i];
if(x == y)
continue;
if(cnt[x - 'a'] == 0)
diff++;
cnt[x - 'a']++;
if(cnt[x - 'a'] == 0)
diff--;
if(cnt[y - 'a'] == 0)
diff++;
cnt[y - 'a']--;
if(cnt[y - 'a'] == 0)
diff--;
}
if(!diff)
ans.emplace_back(s.size() - p.size());
return ans;
}
};
该博客详细介绍了如何使用滑动窗口算法解决LeetCode上的字符串匹配问题。作者通过一个具体的C++实现展示了如何在固定窗口大小下,检查字符串`s`中是否存在与目标字符串`p`相同的子串。代码执行效率高,击败了大多数用户,同时注意到在处理边界情况时的细节处理。

被折叠的 条评论
为什么被折叠?



