如题:
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例 1:
输入: s1 = “ab” s2 = “eidbaooo”
输出: True
解释: s2 包含 s1 的排列之一 (“ba”).
示例 2:
输入: s1= “ab” s2 = “eidboaoo”
输出: False
题意得,s1应该是要小于s2的,如果大于了,直接算错。
if (s1.length() > s2.length())
{
return false;
}
然后,根据前几天曾经做的滑动数组,不自觉的就想往上面想。
(坏习惯)
可以看,既然是这些字母的随便排列是s2的一个子数组。
我就想着要不要全排列。全排列毕竟我不熟。
一看最多数组20000个字母,如果全排列我不直接裂开?
就想着,判断字母数量。
如果s1中的每个字母的数量跟s2中一个子数组的每个字母的数量相同,不就可以?,也符合滑动数组
就有了下面的代码
class Solution {
public:
bool checkInclusion(string s1, string s2) {
int n = s1.length(), m = s2.length();
if (n > m)
{
return false;
}
vector<int> n1(26), m1(26);//定义每个字母出现的次数
for (int i = 0; i < n; i++)
{
n1[s1[i] - 'a']++;//第几个字母++
m1[s2[i] - 'a']++;
}
if (n1 == m1)//如果两个数组的所有的字母出现的次数都相同
{
return true;//说明成功
}
for (int i = n; i < m; i++)
{
m1[s2[i] - 'a']++;
m1[s2[i - n] - 'a']--;
if (n1 == m1)
{
return true;
}
}
return false;
}
};