Leetcode 1100. 长度为 K 的无重复字符子串(DAY 244)---- 后端面试题

该博客主要介绍了如何使用C++编程解决字符串中无重复字符的长度为k的子串数量问题。通过滑动窗口的方法,动态维护一个大小为k的子串,并检查其中字符的重复情况,最终计算符合条件的子串个数。

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


原题题目


在这里插入图片描述


代码实现(首刷自解)


class Solution {
public:
    int numKLenSubstrNoRepeats(string s, int k) {
        if(k > 26 || s.size() < k)  return 0;

        vector<int> cnt(26,0);
        unordered_set<char> set;
        int ret = 0,size = s.size();

        for(int i = 0;i < k;++i)
        {
            auto pos = s[i] - 'a';
            ++cnt[pos];
            if(cnt[pos] >= 2)
                set.emplace(s[i]);
        }

        if(set.empty())     ++ret;

        for(int i = k;i < size;++i)
        {
            ++cnt[s[i] - 'a'];
            --cnt[s[i - k] - 'a'];

            if(cnt[s[i] - 'a'] >= 2)        
                set.emplace(s[i]);

            if(cnt[s[i - k] - 'a'] <= 1 && set.find(s[i - k]) != set.end())    
                set.erase(set.find(s[i - k]));

            if(set.empty()) ++ret;
        }

        return ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love 6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值