Leetcode 424. Longest Repeating Character Replacement 替换得到最长序列 解题报告

1 解题思想

这道题是给了一个由A-Z所构成的英语字符串,然后又k个名额,可以将任意字符替换为另一个字符

现在问,对于给定的条件,能找出的最长的相同的字符序列是多少?

这道题需要用滑动窗口的方式进行,分26个字母去一一尝试,

2 原题

Given a string that consists of only uppercase English letters, you can replace any letter in the string with another letter at most k times. Find the length of a longest substring 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.

3 AC解

public class Solution {
    public int characterReplacement(String s, int k) {
        int n = s.length();
        if ( n == 0 ) return 0;
        char chars[] = s.toCharArray();
        int res = 0;
        for(int i=0;i<26;i++){
            res = Math.max(res,helper(chars,k,n,(char)('A'+i)));
        }
        return res;
    }

    /**
     * 采用滑动窗口的方式进行判别
     * */
    private int helper(char[] seqs,int k,int n,char valid){
        int start = 0;
        int end = 0;
        int res = 0;
        int usedK = 0;
        while( end < n  ){
            if(seqs[end] == valid || usedK < k){
                if(seqs[end]!= valid)
                    usedK ++;
                res = Math.max(res, end - start + 1);
                end++;

            } else{
                //当前长度不够了,需要将头部的进行处理,并且替换已经使用的替换名额
                if(seqs[start] != valid)
                    usedK --;
                start++;
            }
        }
        //System.out.println((char)valid + "  " + res);
        return res;
    }
}

再次特别注明:我发代码的时候是题目当天出来的时候,已经AC了,但是Leetcode可能会更改测试用例,导致代码无法AC
这里写图片描述
如果出现上述情况,请给我留言,我会修正更新代码

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值