424. 替换后的最长重复字符(滑动窗口:双指针)(再看)

替换后的最长重复字符

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

示例 1:
输入:s = “ABAB”, k = 2
输出:4
解释:用两个’A’替换为两个’B’,反之亦然。

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


解题思路

首先,遍历字符串 s,得到每个元素在字母表中的位置(A 对应位置 0,B 对应位置 1,以此类推)来代替字符串中的每个字符。并且,记录当前窗口中每个元素出现的次数,得到窗口内相同元素的最大个数。

若当前窗口中相同元素的最大个数与替换次数 k 之和 < 当前窗口大小(则说明此时不能完全替换掉不同的字母,得到相同字母的子串),此时应该使 left 指针右移缩小窗口。


代码

class Solution {

    public int characterReplacement(String s, int k) {
          
          int maxsame = 0;//存储的是窗口内相同元素的最大个数
          int n = s.length();
          int[] arr = new int[26];//arr中存放的当前窗口中每个元素出现的次数
          int left = 0, right;
          for (right=0;right<n;++right) {

                //得出索引,ASCLL码----A对应位置0,B对应位置1,以此类推...
                int index = s.charAt(right) - 'A';
                //数目加1,因为我们要求出窗口内最多元素
                arr[index]++;
                //得出最大maxsume(窗口内相同的元素个数)
                maxsame = Math.max(maxsame, arr[index]);

                //当前窗口中相同元素的最大个数与替换次数之和 < 当前窗口大小
                //(则说明此时不能完全替换掉不同的字母,得到相同字母的子串。)----缩小窗口
                if (maxsame + k < right - left + 1) {

                    arr[s.charAt(left) - 'A']--;
                    left++;
                }
                
          }
          return right - left;
    }
}

时间复杂度:因为只遍历了一次字符串,且字符串的长度为 n,所以复杂度为O(n)
空间复杂度:因为开辟了新的空间,所以复杂度为O(n)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值