栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leetcode424. 替换后的最长重复字符(中等,难题)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode424. 替换后的最长重复字符(中等,难题)



思路:最长子字符串->滑动窗口
q1:怎么保证窗口内最多非最多字符ch的个数小于等于k?
a1:不用保证,换个思路:_max保存历史窗口内出现个数的最大值即可,当ch出现个数>k时,窗口整体右移一个位置(l++ r++),此时窗口内ch的个数可能大于k,但是对ans并不会产生贡献,除非后面遇到窗口内会出现某个字符个数大于_max,此时窗口长度+1,因此移动过程中窗口是一个变大的窗口。
2:当窗口内**_max + k < r - l + 1**时,表示ch出现个数>k,此时整体右移一个位置。
3:当k==0时,退化为s中最大连续子字符串。
4:r移动到n时,l到n-1是最大的滑动窗口长度。

class Solution {
public:
    int characterReplacement(string s, int k) {
 
        int flag[26] = {0};
        int n = s.size(), l = 0, ans = 0, _max = 0; 
        for (int r = 0; r < n; ++r) {
            flag[s[r] - 'A']++;
            _max = max(_max, flag[s[r] - 'A']);
            if (_max + k < r - l + 1) flag[s[l++] - 'A']--; //
        }
        return n - l; 
    }
};

代码:
1:s由大写字母构成,s来记录窗口内各个字符的个数,当添加s[r]后字符个数大于_max,则更新_ans。
2:if而不是while,因为 l最多移动一个位置

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/949771.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号