给定两个字符串 **s1** 和 **s2**,写一个函数来判断 **s2** 是否包含 **s1** 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
滑动窗口,s2包含s1的排列当且仅当s2存在一个子串,这个子串与s1对应字母个数相同。可以用大小为26的数组记录s1各个字母的个数,s1的话可以边更新到当前位置pos的各个字母的个数,也可以用前缀和。复杂度26 * n。
```c++
class Solution {
public:
bool checkInclusion(string s1, string s2) {
int sum1[10005][26], sum2[26];
memset(sum1, 0, sizeof(sum1)); memset(sum2, 0, sizeof(sum2));
string tmp = s2;
s2 = s1;
s1 = tmp;
s1 = " " + s1;
for(int i = 1; i < s1. size(); I++)
{
for(int j = 0; j < 26; j++) sum1[i][j] = sum1[i - 1][j];
sum1[i][s1[i] - 'a']++;
}
for(int i = 0; i < s2. size(); i++) sum2[s2[i] - 'a']++;
for(int i = 1; i + s2.size() - 1 < s1.size(); I++)
{
bool flag = 1;
for(int j = 0; j < 26; j++)
{
if(sum2[j] != sum1[i + s2.size() - 1][j] - sum1[i - 1][j])
{
flag = 0;
break;
}
}
if(flag) return true;
}
return false;
}
};