LeetCode——567. 字符串的排列

发布时间:2022-06-27 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了LeetCode——567. 字符串的排列脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

目录

  • 题目
    • 1.链接
    • 2.题目描述
    • 3.解题思路
    • 4.题解

题目

1.链接

567. 字符串的排列.

2.题目描述

LeetCode——567. 字符串的排列

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. 字符串的排列所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。