LeetCode 424. Longest Repeating Character Replacem

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

v2-2c33710a0fb67195f12fbd6a451a56d3_1440w.jpg

Description



Given a string s that consists of only uppercase English letters, you can perform at most k operations on that string.


In one operation, you can choose any character of the string and change it to any other uppercase English character.


Find the length of the longest sub-string containing all repeating letters you can get after performing the above operations.


Note:

Both the string's length and k will not exceed 104.


Example 1:


Input:
s = "ABAB", k = 2
Output:
4
Explanation:
Replace the two 'A's with two 'B's or vice versa.


Example 2:


Input:
s = "AABABBA", k = 1
Output:
4
Explanation:
Replace the one 'A' in the middle with 'B' and form "AABBBBA".
The substring "BBBB" has the longest repeating letters, which is 4.


描述



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


注意:

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


示例 1:


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


示例 2:


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


来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/longest-repeating-character-replacement

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路



  • 这道题是使用 滑动窗口 的一道比较典型的题目。
  • 维护一个滑动窗口,并维护一个字典,统计这个窗口内每个字符出现的次数。
  • 记窗口的左右边界为 left,right。记窗口里出现最多次的字符为 Same,记 Same 出现的次数为 max_repeat_count。
  • 主要思路是,向窗口内不断添加字符,并将与 Same (出现最多次)不同的字符,变成 Same,只要当前需要变换的次数小于等于 k,当前就是一个有效的窗口。
  • 移动右边界的条件:窗口内与 Same 不同的字符小于等于 k 时,说明还有变换操作可以用,此时可以继续移动 right;
  • 移动左边界的条件:窗口内与 Same 不同的字符大于 k 时,说明为了使得窗口内的字符都等于 Same,k 次操作已经不够用了,此时应当移动 left


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-11-30 16:32:47
# @Last Modified by:   何睿
# @Last Modified time: 2019-11-30 16:44:05
from collections import defaultdict
class Solution:
    def characterReplacement(self, s: str, k: int) -> int:
        window_count = defaultdict(int) # 统计窗口内每个字符出现过的次数
        res, left, right, count_s = 0, 0, 0, len(s)
        max_repeat_count = 0 # 窗口内出现最多次字符的次数
        while right < count_s:
            window_count[s[right]] += 1 # 次数加一
            # 由于窗口只有 s[right] 增加了一次,那么 出现最多次字符的次数 只需要和这个字符的字符比较就可以了
            max_repeat_count = max(max_repeat_count, window_count[s[right]]) # 更新出现最多次字符的次数
            while right - left + 1 - max_repeat_count > k: # left 向边移动
                window_count[s[left]] -= 1 
                max_repeat_count = max(max_repeat_count, window_count[s[left]])
                left += 1
            res = max(res, right - left + 1) # 窗口内的单词个数
            right += 1
        return res

源代码文件在 这里


目录
相关文章
Leetcode 516. Longest Palindromic Subsequence
找到一个字符串的最长回文子序列,这里注意回文子串和回文序列的区别。子序列不要求连续,子串(substring)是要求连续的。leetcode 5. Longest Palindromic Substring就是求连续子串的。
204 0
|
Java
Leetcode 3. Longest Substring Without Repeating Characters
此题题意是找出一个不包含相同字母的最长子串,题目给出了两个例子来说明题意,但这两个例子具有误导性,让你误以为字符串中只有小写字母。还好我是心机boy,我把大写字母的情况也给考虑进去了,不过。。。。字符串里竟然有特殊字符,于是贡献了一次wrong answer,这次我把ascii字符表都考虑进去,然后就没问题了。这个故事告诫我们在编程处理问题的时候一定要注意输入数据的范围,面试中可以和面试官去确认数据范围,也能显得你比较严谨。
232 3
LeetCode 409. Longest Palindrome
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
220 0
LeetCode 409. Longest Palindrome
LeetCode 395. Longest Substring with At Least K
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
327 0
LeetCode 395. Longest Substring with At Least K
|
Windows
LeetCode 388. Longest Absolute File Path
我们致力于寻找我们文件系统中文件的最长 (按字符的数量统计) 绝对路径。例如,在上述的第二个例子中,最长路径为 "dir/subdir2/subsubdir2/file2.ext",其长度为 32 (不包含双引号)。
238 0
LeetCode 388. Longest Absolute File Path
|
索引
LeetCode 387. First Unique Character in a String
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
382 0
LeetCode 387. First Unique Character in a String
|
存储
LeetCode 329. Longest Increasing Path in a Matrix
给定一个整数矩阵,找出最长递增路径的长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
271 0
LeetCode 329. Longest Increasing Path in a Matrix
|
算法
LeetCode 300. Longest Increasing Subsequence
给定一个无序的整数数组,找到其中最长上升子序列的长度。
209 0
LeetCode 300. Longest Increasing Subsequence
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
522 1
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
496 4
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口

热门文章

最新文章