You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于摩尔投票算法求解最长重复字符替换问题遇阻

最长重复字符替换

题目描述

给定一个字符串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 ≤ 10⁵
  • s仅由大写英文字符组成
  • 0 ≤ k ≤ s.length

我的解题思路

我尝试借鉴**摩尔投票算法(VOYER's MOORE MAJORITY VOTING ALGORITHM)**的思路来解题,但存在知识盲区,代码有错误,希望基于这个思路完成解题:

  • 直觉是假设第一个字符出现次数最多,遇到其他字符则减少ptr值,同时增加计数并更新最大值max
  • 若某一时刻ptr为0且仍有剩余字符,则将当前字符设为最多字符,重复上述流程,类似摩尔投票算法
  • 目前代码存在错误,但已接近正确解

尝试的代码

class Solution {
    public int characterReplacement(String s, int k) {
        
        int count = 0;
        int max = Integer.MIN_VALUE; 
        int ptr = k;  
        char ch = ' ';
        
        for(int i = 0; i < s.length(); i++){
            
            // if at sometime, ptr equals zero then count will also be zero
            if(count == 0){
                ch = s.charAt(i);
                count = 1;
            }
            else{
                if(s.charAt(i) == ch){
                    count++;
                    max = Math.max(count, max);
                }
                else{
                    if(ptr == 0){
                        ch = s.charAt(i);
                        ptr = k;
                        count = 0;
                        continue;
                    }
                    ptr--;
                    count++;
                    max = Math.max(count, max);
                }
            }
        }
        return max;
    }
}

我已了解哈希表解法,但希望用摩尔投票算法完成此题,若表述存在语法错误请见谅,英语并非我的母语。


内容的提问来源于stack exchange,提问作者Vishal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:36:02