给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例1:
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
示例2:
输入: s1= "ab" s2 = "eidboaoo"
输出: False
注意:
输入的字符串只包含小写字母
两个字符串的长度都在 [1, 10,000] 之间
class Solution {
public:
bool checkInclusion(string s1, string s2) {
if (s1.size() > s2.size()) return false;
//为s1建立hash表
unordered_map<char, int> map_tmp;
for (int i=0; i<s1.size(); ++i)
{
if (map_tmp.count(s1[i]))
{
map_tmp[s1[i]]++;
}
else
{
map_tmp[s1[i]] = 1;
}
}
auto mp = map_tmp;
int start_index = 0;
for (int i=0; i<s2.size(); ++i)
{
if (mp.count(s2[i]))
{
mp[s2[i]]--;
}
else //如果不存在,那就从不存在的下一个字符开始遍历
{
mp = map_tmp;
start_index = i+1;
continue;
}
//如果存在负数,说明出现的该字符过多,则从滑窗内第一次出现字符遍历
if (mp[s2[i]] < 0)
{
for (int j=start_index; j<i; ++j)
{
mp[s2[j]]++;
if (s2[j] == s2[i])
{
start_index = j+1;
break;
}
}
}
if (i + 1 - start_index == s1.size())
{
return true;
}
}
return false;
}
};