给你一个字符串 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
s 仅由大写英文字母组成
0<= k <= s.length
2. 题解
2.1 解法一:滑动滑块
import collections
classSolution:defcharacterReplacement(self, s:str, k:int)->int:iflen(s)==0:return0
left, right =0,0
max_char_n =0# counts = collections.Counter()
counts ={}# 用来统计窗口内的字符串出现次数for right inrange(len(s)):# 窗口进入第一个字符
counts[s[right]]= counts.setdefault(s[right],0)+1
max_char_n =max(max_char_n, counts[s[right]])if right - left +1> k + max_char_n:# 窗口移除一个字符串
counts[s[left]]-=1
left +=1return right - left +1if __name__ =="__main__":
s = Solution()
a = s.characterReplacement("AABABBA",1)print(a)
2.2 解法二:滑动滑块
import collections
classSolution:defcharacterReplacement(self, s:str, k:int)->int:
res, max_char_n =0,0
counts = collections.Counter()for i inrange(len(s)):
counts[s[i]]+=1
max_char_n =max(max_char_n, counts[s[i]])if res < max_char_n + k:
res +=1else:
counts[s[i - res]]-=1# 减去最左侧的字符串return res
if __name__ =="__main__":
s = Solution()
a = s.characterReplacement("AABABBA",1)print(a)