给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的 子串 。
示例 1:
输入: s1 = “ab” s2 = “eidbaooo”
输出: True
解释: s2 包含 s1 的排列之一 (“ba”).
示例 2:
输入: s1= “ab” s2 = “eidboaoo”
输出: False
一开始以为是字符串匹配问题,然后就用好移动表来做,提交了才发现是匹配字符串的排列,也就是在一段区域内某个字符出现的频率。
可以使用容器来解决这个问题,容器可以直接比较是否相等
使用滑动窗口
class Solution {
public:
bool checkInclusion(string s1, string s2) {
vector<int> map1(26,0);
vector<int> map2(26,0);
int n1=s1.length();
int n2=s2.length();
if(n1>n2) //处理特殊情况
return false;
for(int i=0;i<n1;i++)
{ //建立字典
map1[s1[i]-'a']++;
map2[s2[i]-'a']++;
}
for(int i=n1;i<n2;i++)
{ //滑动窗口移动
if(map1==map2)
return true;
map2[s2[i-n1]-'a']--; //退出窗口
map2[s2[i]-'a']++; //进入窗口
}
return map1==map2; //比较最后一组
}
};