【问题标题】:Removing a substring from a string, repeatedly重复从字符串中删除子字符串
【发布时间】:2018-02-20 00:16:39
【问题描述】:

问题: 从字符串s 中删除子字符串t,重复并打印执行相同操作所涉及的步骤数。

解释/工作:

例如: t = abs = aabb。第一步,我们检查t 是否为 包含在s 中。这里,t 包含在中间,即a(ab)b。 因此,我们将删除它,结果将是 ab 并增加 count 的值为 1。我们再次检查 t 是否包含在 s 中。现在,t 是 等于s,即(ab)。所以,我们从s 中删除它并增加 count。所以,由于t 不再包含在s 中,我们停止并打印 count 值,在本例中为 2。

所以,这是我尝试过的:

  1. 代码 1:

    static int maxMoves(String s, String t) {
        int count = 0,i;
    
        while(true)
        {
            if(s.contains(t))
            {
                i = s.indexOf(t);
                s = s.substring(0,i) + s.substring(i + t.length());
            }
            else break;
    
            ++count;
        }
    
        return count;
    }
    

    由于某种原因,我只能通过 Hackerrank 上的 9/14 测试用例(我得到 “错误答案” 其余的用例)。过了一会儿,我发现Java中有一个叫做replace()的方法。因此,我尝试通过替换 if 条件来使用它,并提出了第二个版本的代码。

  2. 代码 2:

    static int maxMoves(String s, String t) {
        int count = 0,i;
    
        while(true)
        {
            if(s.contains(t))
                s.replace(t,""); //Marked Statement
            else break;
    
            ++count;
        }
    
        return count;
    }
    

    但由于某种原因(我不知道为什么),上面代码中的 "Marked Statement" 被无限执行(我在替换 "Marked Statement" 时注意到了这一点System.out.println(s.replace(t,""));)。我不是同样的原因。

因为我只通过了 9/14 的测试用例,所以一定有一些逻辑错误导致了“错误答案”。如果我使用 Code 1,我该如何克服?如果我使用代码 2,如何避免无限执行“标记语句”?或者有谁愿意推荐我一个Code 3

提前谢谢你:)

【问题讨论】:

  • 会发生什么,如果字符串在开头,那么substring()的两个索引都是0?
  • 如果给定的 s 或 t 为空字符串会怎样?
  • 想想下面的例子,"".replace("","")?这会结束吗?
  • 你想解决the Hackerrank challenge Reducto吗?如果是这样,可能有多个字符串可能被删除,并且由于删除可能会创建新的子字符串出现,因此为每个子字符串顺序运行maxCounts 是不够的。
  • 考虑字符串“cabaaba”,您应该从中删除两个子字符串“aa”和“bb”。去掉“aa”,你就得到了“cabba”。去掉“bb”,得到“caa”。但是您还没有完成,因为最终结果应该只是“c”。 (我没有详细研究过这个任务,但即使你删除字符串的顺序也可能很重要。例如,如果你有一个字符串“aaaa”,那么首先删除“aaa”将不再使你能够删除“ aa" 两次以将字符串缩减为 ""。)

标签: java string algorithm replace substring


【解决方案1】:

尝试保存新的(返回的)字符串而不是忽略它。

s = s.replace(t,"");

replace 返回一个新字符串;您似乎认为它会就地更改给定的字符串。

【讨论】:

  • 我现在只能通过 3/14 个案例 :(
  • @PrakharSaxena 你没有正确阅读挑战。如果它只是重​​复删除一个字符串,那么编码挑战就不会那么难了。这是关于找到删除字符串的子字符串的最大可能移动。如果你从左边开始,那么当你从右边开始时,你可能会得到不同数量的子字符串
【解决方案2】:

尝试添加一些简单的字符串参数检查。字符串不应等于 null,并且它们的长度应大于 0 以允许大于 0 的计数。

static int maxMoves(String s, String t) {
    int count = 0,i;

    if(s == null || s.length() == 0 || t == null || t.length() == 0)
        return 0;

    while(true)
    {
        if(s.contains(t) && !s.equals(""))
            s = s.replace(t,""); //Marked Statement
        else break;

        ++count;
    }

    return count;
}

【讨论】:

    【解决方案3】:

    您可能在代码 1 中遗漏了边缘情况。 在代码 2 中,您没有在替换函数之后存储形成的新字符串。 replace 函数用指定的文字替换序列替换此字符串中与文字目标序列匹配的每个子字符串。

    试试这个:

    public static int findCount(String s, String t){
    
        if( null == s || "" == s || null == t || "" == t)
            return 0;
        int count =0;
        while(true){
            if(s.contains(t)){
                count++;
                int i = s.indexOf(t);
                s = s.substring(0, i)+s.substring(i+t.length(), s.length());
                // s = s.replace(t,"");
            }
            else
                break;
        }
    
        return count;
    }
    

    【讨论】:

      【解决方案4】:
         String r1="ramraviraravivimravi";
         String r2="ravi";
          int count=0,i;
          while(r1.contains(r2))
          {
              count++;
              i=r1.indexOf(r2);
              StringBuilder s1=new StringBuilder(r1);
              s1.delete(i,i+r2.length());
              System.out.println(s1.toString());
              r1=s1.toString();
          }
      

      System.out.println(count);

      【讨论】:

        【解决方案5】:

        首先,这两个代码在逻辑上没有区别。

        所有提到的答案都是为了纠正代码 2 的错误,但没有人告诉如何通过所有 (14/14) 案例。 这里我提到了一个你的代码会失败的测试用例。

        s = "abcabcabab"; t = "abcab"

        你的答案 1 预期答案 2

        根据您的代码: 第一步,从 s 的索引 0 中删除 t, s 将减少为“cabab”,因此计数仅为 1。

        但实际答案应该是 2 我第一步,从 s 的索引 3 中删除 t, s 将减少为“abcab”,count = 1。

        在第二步中,从索引 0 中删除 t, s 将减少为 "",count = 2。

        所以答案是 2。

        如果有人知道如何处理此类情况,请告诉我。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-12
          • 2018-04-01
          • 2018-06-09
          • 1970-01-01
          • 2021-04-13
          • 1970-01-01
          • 2012-04-08
          • 1970-01-01
          相关资源
          最近更新 更多