给定两个字符串
s和p,找到s中所有p的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
- 1
- 2
- 3
- 4
- 5
示例 2:
输入: s = "abab", p = "ab" 输出: [0,1,2] 解释: 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
- 1
- 2
- 3
- 4
- 5
- 6
提示:
1 <= s.length, p.length <= 3 * 104s和p仅包含小写字母
s中构造一个长度为与字符串p的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量p的异位词26的数组来模拟哈希表,一个来保存s中的子串每个字符出现的个数,p每一个字符出现的个数。这样就能判断两个串是否是异位词hash1数组,用来统计字符串p中每个字符出现的次数。hash2数组,用来统计滑动窗口内每个字符出现的次数。left和右边界right都初始化为0。s,从左到右依次将字符加入窗口。p的长度,就需要移动窗口,判断是否需要从窗口中移出最左边的字符。hash2数组和count变量。p的异位词。如果是,将左边界的索引加入结果数组ret。ret。
class Solution {
public:
vector findAnagrams(string s, string p) {
vector ret;
int hash1[26]={0};//统计字符串p中每个字符出现的次数
for(auto ch:p)
hash1[ch-'a']++;
int hash2[26]={0};//统计窗口里面的每个字符出现的个数
int m=p.size();
for(int left=0,right=0,count=0;rightm)//判断
{
char out=s[left++];
if(hash2[out-'a']--<=hash1[out-'a'])count--;//出窗口+维护 count
}
//更新结果
if(count==m)
ret.push_back(left);
}
return ret;
}
};