LeetCode——567. 字符串的排列

Posted Domo✘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——567. 字符串的排列相关的知识,希望对你有一定的参考价值。

题目

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;
    
;


以上是关于LeetCode——567. 字符串的排列的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode——567. 字符串的排列

leetcode 567. 字符串的排列

Leetcode刷题100天—567. 字符串的排列(滑动窗口)—day22

Leetcode刷题100天—567. 字符串的排列(滑动窗口)—day22

滑动窗口同数组的结合(LeetCode 438.找到字符串中所有字母异位词&567.字符串的排列)

567. 字符串的排列