1.题目
2.解析
这道题我们用滑动窗口来实现,加上哈希表和vector容器的使用来实现这道题目,每次滑动之后我们都对其和答案进行比较,如果全部相等我们返回left,不相等继续滑动即可。
本质就是我们把p中相同数量的字母框起来,然后依次向s中向右滑动,每滑动一次我们都保证了滑动窗口中字母的数量和p中的相等,每次滑动之后我们都对窗口中的字母和p中存储在哈希表中的进行对比。相等返回left,不相等继续向右滑动,知道right出窗口结束滑动。
3.代码
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
map<char, int>num1;
map<char, int>num2;
vector<int>nums;
for (int i = 0; i < 26; i++)
{
num1.insert({ 'a' + i,0});
num2.insert({ 'a' + i,0});
}
for (auto e : p)
{
num1[e]++;
}
for (int i = 0; i < p.size(); i++)
{
num2[s[i]]++;
}
for (int left = 0, right = p.size() - 1; right < s.size();)
{
int count = 0;
for (int j = 0; j < 26; j++)
{
if (num1['a' + j]!= num2['a' + j]) {
count++;
break;
}
}
if (count == 0)nums.push_back(left);
num2[s[left]]--;
left++;
right++;
num2[s[right]]++;
}
return nums;
}
};