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就是求连续子串的。
48 0
|
Java
Leetcode 3. Longest Substring Without Repeating Characters
此题题意是找出一个不包含相同字母的最长子串,题目给出了两个例子来说明题意,但这两个例子具有误导性,让你误以为字符串中只有小写字母。还好我是心机boy,我把大写字母的情况也给考虑进去了,不过。。。。字符串里竟然有特殊字符,于是贡献了一次wrong answer,这次我把ascii字符表都考虑进去,然后就没问题了。这个故事告诫我们在编程处理问题的时候一定要注意输入数据的范围,面试中可以和面试官去确认数据范围,也能显得你比较严谨。
50 3
LeetCode 409. Longest Palindrome
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
74 0
LeetCode 409. Longest Palindrome
LeetCode 395. Longest Substring with At Least K
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
90 0
LeetCode 395. Longest Substring with At Least K
|
Windows
LeetCode 388. Longest Absolute File Path
我们致力于寻找我们文件系统中文件的最长 (按字符的数量统计) 绝对路径。例如,在上述的第二个例子中,最长路径为 "dir/subdir2/subsubdir2/file2.ext",其长度为 32 (不包含双引号)。
83 0
LeetCode 388. Longest Absolute File Path
|
索引
LeetCode 387. First Unique Character in a String
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
107 0
LeetCode 387. First Unique Character in a String
|
存储
LeetCode 329. Longest Increasing Path in a Matrix
给定一个整数矩阵,找出最长递增路径的长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
70 0
LeetCode 329. Longest Increasing Path in a Matrix
|
算法
LeetCode 300. Longest Increasing Subsequence
给定一个无序的整数数组,找到其中最长上升子序列的长度。
52 0
LeetCode 300. Longest Increasing Subsequence
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
113 2