1.题目解析
本题的题目要求是给定一个长字符串s与一个较短字符串p,判断s中是否有一段与p长度相同的字符串是由p打乱而得来,即为异位词,然后返回其开始位置下标,遍历s字符串中所有满足条件字符串的起始位置下标
2.算法原理
我们将p中的字符串个数统计在一个哈希表里,然后使用"滑动窗口"的思想来遍历p字符串中的异位词,此时设置一个变量count来统计窗口内有效字符的个数,如果窗口内有效字符的个数满足p字符串长度则为异位词,返回其下标即可,然后向后遍历直到结束
3.代码展示
class Solution {
public:
vector<int> findAnagrams(string s, string p)
{
vector<int> v;
int hash1[26] = { 0 };
int hash2[26] = { 0 };//统计窗口中出现字符的个数
for(auto ch : p)
{
hash1[ch - 'a']++;//统计p中字符串长度
}
int m = p.size();
int n = s.size();
for(int left = 0,right = 0,count = 0;right < n;right++)
{
char in = s[right];
if(++hash2[in - 'a'] <= hash1[in - 'a'])
{
count++;//进窗口 + 维护 count
}
if(right - left + 1 > m)
{
char out = s[left++];
if(hash2[out - 'a']-- <= hash1[out - 'a'])
{
count--;//出窗口 + 维护 count
}
}
if(count == m)
{
v.push_back(left);
}
}
return v;
}
};