Leetcode 567. 字符串的排列(滑动窗口)

给定两个字符串 **s1** 和 **s2**,写一个函数来判断 **s2** 是否包含 **s1** 的排列。

换句话说,第一个字符串的排列之一是第二个字符串的子串。

滑动窗口,s2包含s1的排列当且仅当s2存在一个子串,这个子串与s1对应字母个数相同。可以用大小为26的数组记录s1各个字母的个数,s1的话可以边更新到当前位置pos的各个字母的个数,也可以用前缀和。复杂度26 * n。

```c++
class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        int sum1[10005][26], sum2[26];
        memset(sum1, 0, sizeof(sum1)); memset(sum2, 0, sizeof(sum2));
        string tmp = s2;
        s2 = s1; 
        s1 = tmp;
        s1 = " " + s1;
        for(int i = 1; i < s1. size(); I++)
        {
            for(int j = 0; j < 26; j++) sum1[i][j] = sum1[i - 1][j];
            sum1[i][s1[i] - 'a']++;
        }
        for(int i = 0; i < s2. size(); i++) sum2[s2[i] - 'a']++;
        for(int i = 1; i + s2.size() - 1 < s1.size(); I++)
        {
            bool flag =  1;
            for(int j = 0; j < 26; j++)
            {
                if(sum2[j] != sum1[i + s2.size() - 1][j] - sum1[i - 1][j])
                {
                    flag = 0;
                    break;
                }
            }
            if(flag) return true;
        }
        return false;
    }
};
posted @   脂环  阅读(72)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-02-10 Codeforces Round #618 (Div. 2)A. Non-zero
2020-02-10 Codeforces Round #618 (Div. 2)C. Anu Has a Function
点击右上角即可分享
微信分享提示
主题色彩