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