题目
1.链接
567. 字符串的排列.
2.题目描述
3.解题思路
1.由于排列不会改变字符串中每个字符的个数,所以只有当两个字符串每个字符的个数均相等时,一个字符串才是另一个字符串的排列。 根据这一性质,记 s1的长度为 n,我们可以遍历 s2中的每个长度为 n 的子串,判断子串和 s1中每个字符的个数是否相等,若相等则说明该子串是 s1的一个排列。
使用两个数组cnt1和cnt2 , cnt1统计s1中各个字符的个数,cnt 2统计当前遍历的子串中各个字符的个数。 由于需要遍历的子串长度均为 n,我们可以使用一个固定长度为 n的滑动窗口来维护cnt2,滑动窗口每向右滑动一次,就多统计一次进入窗口的字符,少统计一次离开窗口的字符。然后,判断 cnt1是否与 cnt 2?相等,若相等则意味着 s1的排列之一是 s2 的子串。
4.题解
class Solution {
public:
bool checkInclusion(string s1, string s2) {
int n = s1.length(), m = s2.length();
if (n > m) {
return false;
}
vector<int> cnt1(26), cnt2(26);
for (int i = 0; i < n; ++i) {
++cnt1[s1[i] - 'a'];
++cnt2[s2[i] - 'a'];
}
if (cnt1 == cnt2) {
return true;
}
for (int i = n; i < m; ++i) {
++cnt2[s2[i] - 'a'];
--cnt2[s2[i - n] - 'a'];
if (cnt1 == cnt2) {
return true;
}
}
return false;
}
};
|