leetcode567. 字符串的排列

本文介绍了一种使用哈希表和窗口滑动策略解决LeetCode上字符串排列问题的解决方案。通过构建两个哈希表,对比两个字符串中字符出现频率,判断目标字符串是否包含原字符串的排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://leetcode-cn.com/problems/permutation-in-string/

题意:

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

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

方法:使用两张哈希表+窗口滑动

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        unordered_map<char,int> mp1;
        unordered_map<char,int> mp2;

        for(int i=0;i<26;i++)
        {
            mp1[i+'a'] = 0;//初始化
            mp2[i+'a'] = 0;//哈希表初始化
        }

        for(auto &ch:s1)
        {
            mp1[ch]++;
        }

        int l=0,r=0;

        while(r<s2.size())//模拟窗口滑动
        {
            mp2[s2[r++]]++;//右侧对应的项出现的次数加一,往右滑动一个单位
            if(r-l>s1.size()) mp2[s2[l++]]--;//如果超过s1的长度,最左侧的标记往右移动一个单位,并且对应项的次数减一
            if(mp1==mp2) return true;
        }

        return false;

    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值