当前位置: 首页 > 知识库问答 >
问题:

在Leetcode练习中面临与字符串相关的问题

狄奕
2023-03-14

单击此处查看问题链接。

从今天起我一直在努力解决这个问题,但我缺乏一些知识。我试图用受沃耶摩尔多数投票算法启发的方法来解决这个问题。

  • 我的直觉是,假设第一个字符将具有max count,然后如果我们找到另一个字符,则减少ptr的值并增加count,同时将值存储在max中。
  • 如果在某个时候,ptr==0,并且仍然有字符剩余,则将当前字符作为max_character并重复相同的过程。类似于多数投票算法。
  • 但是,我犯了一些错误,我不知道是什么,但我真的很接近,想用这种方法解决这个问题。
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;
    }
}

我希望,我能够清楚地解释我的方法,英语不是我的母语,所以语法错误可能会发生。而且,我知道用hashmap解决这个问题的方法,但我想用这个方法解决这个问题。

共有1个答案

严柏
2023-03-14

您有一个逻辑错误,即一旦您耗尽k,代码就需要返回到第一个替换索引以恢复搜索。

您的实现只需从最后一个索引恢复搜索,其中k已用完。

使用第一个失败的案例(字符替换("BABABBA",1)),发布的代码会找到这些子序列(以粗体显示的子序列-第一行是测试用例):

巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴

当它应该找到:

巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴

要解决此问题,应首先将for循环更改为while循环:

i = 0;
while (i < s.length()) {
}

并引入一个索引变量lastStart,它指示第一次不匹配时子序列的开始:

int lastStart = 0;

并将其重置为0,只要有序列匹配:

if (count == 0) {
    // .. existing code
    lastStart = 0;
}

当替换耗尽时,重置循环变量子序列不匹配,并在第一个子序列不匹配时保持上次启动。

else {
    if (ptr == 0) {
        // existing code
        i = lastStart;
    }
    if (ptr == k) lastStart = i;
    // existing code
}

结果:

 类似资料:
  • 每当我试图打开Eclipse或SpringToolSuite 4时,我都会遇到同样的权限相关问题。前天它工作得很好,但现在它显示了奇怪的东西。 您没有打开应用程序“SpringToolSuite4”的权限。 您没有打开应用程序“Eclipse”的权限。 如果有人有任何解决方案,请分享

  • 1. 字符串循环移位包含 2. 字符串循环移位 3. 字符串中单词的翻转 4. 两个字符串包含的字符是否完全相同 5. 计算一组字符集合可以组成的回文字符串的最大长度 6. 字符串同构 7. 回文子字符串个数 8. 判断一个整数是否是回文数 9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数 1. 字符串循环移位包含 编程之美 3.1 // html s1 = AABCD, s2

  • 5.31 编写一个程序,用函数 strcmp 比较用户输入的两个字符串。程序指出第一个字符串是小于、等于或大于第二个字符串。 5.32 编写一个程序,用函数 strncmp 比较用户输入的两个字符串,程序要输入比较的字符数。程序指出第一个字符串是小于、等于或大于第二十字符串。 5.33 编写一个程序,用随机数产生器建立语句。程序用4个char类型的指针数组 article、noun、verb 和

  • 这个练习中,我会向你展示可能是最快的字符串搜索算法之一,并且将它与bstrlib.c中现有的binstr比较。binstr的文档说它仅仅使用了“暴力搜索”的字符串算法来寻找第一个实例。我所实现的函数使用Boyer-Moore-Horspool(BMH)算法,如果你分析理论时间的话,一般认为它会更快。你也会看到,如果我的实现没有任何缺陷,BMH的实际时间会比binstr简单的暴力搜索更糟。 这个练习

  • 问题内容: 我正在使用Java NIO进行套接字连接,并且我的协议是基于文本的,因此我需要能够将字符串转换为ByteBuffer,然后再将其写入SocketChannel,并将传入的ByteBuffer转换回String。目前,我正在使用以下代码: 这在大多数情况下都有效,但是我怀疑这是进行此转换各个方向的首选(或最简单)方法,还是有其他尝试的方法。偶尔,和看似随意,将呼叫和将抛出一个 异常,或类

  • 我已经在练习26中,构建devpkg的时候介绍了Better String库。这个练习让你从现在开始熟悉bstring库,并且明白C风格字符串为什么十分糟糕。之后你需要修改liblcthw的代码来使用bstring。 为什么C风格字符串十分糟糕 当人们谈论C的问题时,“字符串”的概念永远是首要缺陷之一。你已经用过它们,并且我也谈论过它们的种种缺陷,但是对为什么C字符串拥有缺陷,以及为什么一直是这样