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

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

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

 

示例 1:

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

示例 2:

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


将任意位置上的字符替换成另外的字符,总共可最多替换 次的符合条件的子字符串
<=>
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;
    }
};

 

posted @ 2021-02-02 15:14  XXXSANS  阅读(89)  评论(0编辑  收藏  举报