题目描述:
Given two strings s1 and s2, write a function to return true if s2 contains the permutation of s1. In other words, one of the first string's permutations is the substring of the second string.
Example 1:
Input:s1 = "ab" s2 = "eidbaooo"
Output:True
Explanation: s2 contains one permutation of s1 ("ba").
Example 2:
Input:s1= "ab" s2 = "eidboaoo"
Output: False
Note:
1. The input strings only contain lower case letters.
2. The length of both given strings is in range [1, 10,000].
class Solution {
public:
bool checkInclusion(string s1, string s2) {
unordered_map<char,int> hash;
for(char c:s1) hash[c]++;
int n=s1.size();
int count=n; //count表示滑动窗口中和s1相差的字符数
int i=0;
int j=0;
while(j<s2.size())
{
if(hash.count(s2[j])) //新加入s2[j]
{
if(hash[s2[j]]>0) count--;
hash[s2[j]]--;
}
if(count==0) //说明滑动窗口中包含了s1中所有字符,此时需要移动i
{
while(i<=j)
{
if(hash.count(s2[i])==0) i++; //s1中不存在s2[i],直接删除
else if(hash[s2[i]]<0) //说明滑动窗口中的s2[i]的个数多于s1中,可以直接删除
{
hash[s2[i]]++;
i++;
}
else if(hash[s2[i]]==0) //说明滑动窗口中恰好包含了s1中所有字符
{
if(j-i+1==n) return true;
hash[s2[i]]++; //如果滑动窗口长度大于s1,那么移动i,进行下一次迭代
i++;
count++;
break;
}
}
}
j++;
}
return false;
}
};