给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)
示例 1:
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:
输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
采用滑动窗口方法(定长的滑动窗口)
class Solution {
public:
vector<int> findAnagrams(string s, string p)
{
unordered_map<char,int> need,window;
for(char c:p)
need[c]++;
vector<int> v;
int right=0,left=0;
int vaild=0;
while(right<s.size())//判断右侧窗口是否需要扩展
{
char c=s[right];
right++;
if(need.count(c))
{
window[c]++;
if(need[c]==window[c])
{
vaild++;
}
}
while(right-left>=p.size())//判断左侧窗口是否需要收缩
{
if(vaild==need.size())//当窗口符合条件时,把起始位置加入v
{
v.push_back(left);
}
char d=s[left];
left++;
if(need.count(d))
{
if(need[d]==window[d])
{
vaild--;
}
window[d]--;
}
}
}
return v;
}
};
因为是定长滑动窗口,所以:
1、什么时候应该扩大窗口?窗口不足定长时
2、什么时候应该缩小窗口?窗口大于定长时
3、什么时候得到一个合法的答案?窗口等于定长,且符合条件