这道题跟第14题 非常相似。
因为字符串中全是小写字母,故可以用长度为26的数组模拟哈希表。
- 把字符串
s1
的每个字符存入哈希表,哈希表的键表示字母,值表示该字母在整个字符串中出现的次数;- 遍历字符串
s2
,用滑动窗口的思想,窗口大小即字符串s1
的长度,在哈希表中减去窗口内出现相应字母的次数。如果遍历到某一窗口时,哈希表中的值全为0
,则在字符串s2
中该窗口内的子串为s1
的变位词。
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> res, hash(26, 0), hashZero(26, 0); //hashZero是用来判空的
if (s.length() < p.length()) return res; //模式串不长度能大于要查找的字符串长度
for (int i = 0; i < p.length(); ++i) //构造哈希表
{
hash[p[i] - 'a'] ++ ;
hash[s[i] - 'a'] -- ;
}
if (hash == hashZero) res.push_back(0);
for (int i = p.length(); i < s.length(); ++ i) //注意循环从s1.length()开始
{
hash[s[i] - 'a'] -- ; //滑动窗口右端推进
hash[s[i - p.length()] - 'a'] ++ ; //滑动窗口左端恢复
if (hash == hashZero) res.push_back(i - p.length() + 1);
}
return res;
}
};