题目:题目链接
思路:滑动窗口嘛。为啥?Related topic里面有。 简单来说就是利用一个大小为p.size()的窗口,从s的第0个位置开始比对,然后比完了就右移一个位置。
比对的话直接用map就可以,因为只要它们二者的组成字符一样就可以。先用一个map存放p的各个字符的出现次数。再用一个map放当前滑动窗口内s的字符串。
可如果每移动到新的位置都从窗口岂是位置开始匹配,那时间复杂度太高了,过不了。怎么改呢?
我们窗口每次向左移动一个位置啊!那么当前窗口和前一个窗口不一样的地方就是少了字符,多了字符 如上图所示,当前窗口比前一个窗口少了i,多了j。 那么我们可以这样改进一下,就可以了。 看代码:
class Solution {
public:
unordered_map<int, int>mp, mp1;
bool judge() {
for (int i = 0; i < 26; ++i) {
if (mp[i] != mp1[i]) return false;
}
return true;
}
vector<int> findAnagrams(string s, string p) {
if (p.size() > s.size()) return {};
vector<int>ans;
for (int i = 0; i < p.size(); ++i) {
mp[p[i] - 'a']++;
mp1[s[i] - 'a']++;
}
if (judge()) ans.push_back(0);
for (int i = 1; i <= s.size() - p.size(); ++i) {
mp1[s[i - 1] - 'a']--;
mp1[s[i + p.size() - 1] - 'a']++;
if (judge()) ans.push_back(i);
}
return ans;
}
};
加油加加油加油加油加油!!!!加油加油加加油!! 你一定可以的!!
|