一、题目
二、思路
哈希表+双指针
1、哈希表存储对应字符个数
2、如果两个字符串是变位词,那么他们的哈希表应该是一样的,所以一+一-应该是都为0
3、双指针,指针的窗口大小为len,两个指针同时向右移动
4、在每个窗口内,要判断哈希表中的值是不是为0,如果都为0则直接返回true,如果不是就把窗口往右移动
三、代码
class Solution
{
public:
bool checkInclusion(string s1, string s2)
{
if (s1.length() > s2.length())
{
return false;
}
unordered_map<char, int> dic;
int len1 = s1.length();
int len2 = s2.length();
//哈希表存储对应字符个数
//如果两个字符串是变为词,那么他们的哈希表应该是一样的,所以一+一-应该是都为0
for (int i = 0; i < len1; ++i)
{
dic[s1[i]]++;
dic[s2[i]]--;
}
//这里不添加len1-1这个,放到while循环里添加
dic[s2[len1 - 1]]++;
int left = 0;
int right = len1 - 1;
//双指针,指针的窗口大小为len,两个指针同时向右移动
while (right < len2)
{
dic[s2[right]]--;
int pos = 0;
for (auto iter = dic.begin(); iter != dic.end(); ++iter)
{
if (iter->second != 0)
{
pos = 1;
break;
}
}
if (pos == 0)
{
return true;
}
dic[s2[left]]++;
left++;
right++;
}
for (auto iter = dic.begin(); iter != dic.end(); ++iter)
{
if (iter->second != 0)
{
return false;
}
}
return true;
}
};