LeetCode——567. 字符串的排列
Posted Domo✘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——567. 字符串的排列相关的知识,希望对你有一定的参考价值。
题目
1.链接
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;
;
以上是关于LeetCode——567. 字符串的排列的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天—567. 字符串的排列(滑动窗口)—day22
Leetcode刷题100天—567. 字符串的排列(滑动窗口)—day22