424. 替换后的最长重复字符
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:字符串长度 和 k 不会超过 104。
示例 1:
输入:s = "ABAB", k = 2 输出:4 解释:用两个'A'替换为两个'B',反之亦然。
示例 2:
输入:s = "AABABBA", k = 1 输出:4 解释: 将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。 子串 "BBBB" 有最长重复字母, 答案为 4。
将任意位置上的字符替换成另外的字符,总共可最多替换 k 次的符合条件的子字符串
<=>
len(substr)-max(Counter(substr))<=k
<=>
r-l+1-maxcnt<=k
py
TLE 36/37
class Solution: from collections import Counter def characterReplacement(self, s: str, k: int) -> int: l=r=0 res=0 while r<len(s): if len(s)-l<res: break if r-l+1-max(Counter(s[l:r+1]).values())>k: l+=1 res=max(res,r-l+1) r+=1 return res
optimization,use Dictionary===>AC:
class Solution: from collections import Counter import string def characterReplacement(self, s: str, k: int) -> int: l=r=0 res=0 maxchar=0 cnt={} for char in ascii_uppercase: cnt[char]=0 while r<len(s): if len(s)-l<res: break cnt[s[r]]+=1 maxchar=max(cnt.values()) if r-l+1-maxchar>k: cnt[s[l]]-=1 l+=1 res=max(res,r-l+1) r+=1 return res
C++
class Solution { public: int characterReplacement(string s, int k) { int l=0,r=0,maxchar=0,res=0; vector<int>cnt(26); while(r<s.size()){ cnt[s[r]-'A']++; for(int i:cnt)maxchar=max(maxchar,i); if(r-l+1-maxchar>k){ cnt[s[l]-'A']--; l++; } res=max(res,r-l+1); r++; } return res; } };