LeetCode 424.替换后的最长重复字符

给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。

在执行上述操作后,返回 包含相同字母的最长子字符串的长度。

示例 1:

输入:s = "ABAB", k = 2

输出:4

解释:用两个'A'替换为两个'B',反之亦然。

示例 2:

输入:s = "AABABBA", k = 1

输出:4

解释:

将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。

子串 "BBBB" 有最长重复字母, 答案为 4。

可能存在其他的方法来得到同样的结果。

提示:

1 <= s.length <= 105^55

s 仅由大写英文字母组成

0 <= k <= s.length

滑动窗口,窗口内除数量最多的字符外,其他字符加起来不能超过k,找出最长的该窗口即可:

cpp 复制代码
class Solution {
public:
    int characterReplacement(string s, int k) {
        int left = 0;
        map<char, int> cnt;
        multiset<int> cntNum;
        int ans = 0;
        for (int i = 0; i < s.size(); ++i) {
            auto it = cntNum.find(cnt[s[i]]);
            if (it != cntNum.end()) {
                cntNum.erase(it);
            }
            ++cnt[s[i]];
            cntNum.insert(cnt[s[i]]);

            while (i - left + 1 - *cntNum.rbegin() > k) {
                auto it = cntNum.find(cnt[s[left]]);
                if (it != cntNum.end()) {
                    cntNum.erase(it);
                }
                --cnt[s[left]];
                cntNum.insert(cnt[s[left]]);
                
                ++left;
            }

            ans = max(ans, i - left + 1);
        }
        return ans;
    }
};

如果字符串s的长度为n,s中的字符种类为m,则此算法时间复杂度为O(n),空间复杂度为O(m),cntNum里最多有cnt.size()个元素。

相关推荐
坐望云起25 分钟前
Hyper-V + Centos stream 9 搭建K8s集群(二)
linux·kubernetes·centos
恣艺1 小时前
LeetCode 132:分割回文串 II
算法·leetcode·代理模式
LZQqqqqo3 小时前
C# 中生成随机数的常用方法
java·算法·c#
程序员编程指南3 小时前
Qt 嵌入式 Linux 系统定制全指南
linux·c语言·开发语言·c++·qt
葵续浅笑4 小时前
LeetCode - 合并两个有序链表 / 删除链表的倒数第 N 个结点
java·算法·leetcode
皓月盈江5 小时前
Linux Deepin深度操作系统应用商店加载失败,安装星火应用商店
linux·debian·deepin·国产操作系统·深度操作系统·星火应用商店·deepin应用商店加载失败
Linux技术芯6 小时前
#Linux内存管理# 详细介绍madvise函数的工作原理
linux
Hey! Hey!7 小时前
在 Ubuntu 22.04 上运行 cAdvisor 时遇到 mountpoint for cpu not found 错误
linux·运维·ubuntu
渡我白衣7 小时前
Linux网络编程:基于UDP 的聊天室雏形
linux·网络·udp
哪 吒8 小时前
【2025C卷】华为OD机试九日集训第3期 - 按算法分类,由易到难,提升编程能力和解题技巧
python·算法·华为od·华为od机试·2025c卷