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

发布于 2023-06-03 19:27:53 字数 2207 浏览 63 评论 0

给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。

注意:字符串长度 和 k 不会超过 104。

示例 1:

输入:s = "ABAB", k = 2
输出:4
解释:用两个'A'替换为两个'B',反之亦然。

示例 2:

输入:s = "AABABBA", k = 1
输出:4
解释:
将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
子串 "BBBB" 有最长重复字母, 答案为 4。

最长连续 1 模型

思路

这道题和那两道题差不多。唯一的不同是这道题是 26 种可能(因为每一个大写字母都可能是最终的最长重复子串包含的字母),而上面两题是一种可能。这也不难,枚举 26 种情况,取最大值就行了。

最长连续 1 模型可以直接参考上面的链接。其核心算法简单来说,就是维护一个可变窗口,窗口内的不重复字符小于等于 k,最终返回最大窗口的大小即可。

关键点

  • 最长连续 1 模型

代码

  • 语言支持:Python3

Python3 Code:


class Solution:
    def characterReplacement(self, s: str, k: int) -> int:
        def fix(c, k):
            ans = i = 0
            for j in range(len(s)):
                k -= s[j] != c
                while i < j and k < 0:
                    k += s[i] != c
                    i += 1
                ans = max(ans, j - i + 1)
            return ans

        ans = 0
        for i in range(26):
            ans = max(ans, fix(chr(ord("A") + i), k))
        return ans

复杂度分析

令 n 为数组长度。

  • 时间复杂度:$O(26 * n)$
  • 空间复杂度:$O(1)$

空间换时间

思路

我们也可以用一个长度为 26 的数组 counts 记录每个字母出现的频率,如果窗口大小大于最大频率+k,我们需要收缩窗口。

这提示我们继续使用滑动窗口技巧。和上面一样,也是维护一个可变窗口,窗口内的不重复字符小于等于 k,最终返回最大窗口的大小即可。

关键点

  • 空间换时间

代码

  • 语言支持:Python3

Python3 Code:

class Solution:
    def characterReplacement(self, s: str, k: int) -> int:
        if not s: return 0
        counts = [0] * 26
        i = most_fraq = 0
        for j in range(len(s)):
            counts[ord(s[j]) - ord("A")] += 1
            most_fraq = max(most_fraq, counts[ord(s[j]) - ord("A")])
            if i < j and j - i + 1 - most_fraq > k:
                counts[ord(s[i]) - ord("A")] -= 1
                i += 1
        return j - i + 1

复杂度分析

令 n 为数组长度。

  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(26)$

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

倾其所爱

暂无简介

文章
评论
28 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文