从字符串中反复删除子字符串

3
问题:
从字符串s中重复删除子串t,并打印执行此操作所需的步骤数。
说明/工作原理:
例如:t = ab,s = aabb。在第一步中,我们检查t是否包含在s中。这里,t包含在中间即a(ab)b。因此,我们将其删除,结果为ab,并将计数值增加1。我们再次检查t是否包含在s中。现在,t等于s即(ab)。因此,我们将其从s中删除并增加计数。因此,由于t不再包含在s中,我们停止并打印计数值,本例中为2。
所以,这是我尝试过的:
  1. Code 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;
    }
    

    I am just able to pass 9/14 test cases on Hackerrank, due to some reason (I am getting "Wrong Answer" for rest of the cases). After a while, I found out that there is something called replace() method in Java. So, I tried using that by replacing the if condition and came up with a second version of code.

  2. Code 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;
    }
    

    But for some reason (I don't know why), the "Marked Statement" in the above code gets executed infinitely (this I noticed when I replaced the "Marked Statement" with System.out.println(s.replace(t,""));). I don't the reason for the same.

由于我只通过了9/14个测试用例,可能存在一些逻辑错误导致了"Wrong Answer"。如果我使用Code 1,我该如何克服这个问题?如果我使用Code 2,我该如何避免"Marked Statement"的无限执行?还是有人想建议我使用Code 3吗?

提前感谢你的帮助 :)


如果字符串位于开头,substring() 的两个索引都为0会发生什么? - Amin Negm-Awad
如果s或t是空字符串,会发生什么? - RAZ_Muh_Taz
想一下以下的情况,"".replace("","")?这会有结果吗? - RAZ_Muh_Taz
1
考虑字符串“cabaaba”,你需要删除其中的两个子串“aa”和“bb”。先删除“aa”,得到“cabba”,再删除“bb”,得到“caa”。但这还不够,因为最终结果应该只剩下“c”。(我没有详细研究这个任务,但删除字符串的顺序可能很重要。例如,如果有一个字符串“aaaa”,先删除“aaa”将不再使您能够两次删除“aa”以将字符串缩减为“”。) - M Oehm
欢迎来到StackOverflow。请仔细阅读并遵守帮助文档中的发布指南。此处适用于“最小化、完整性和可验证性”的样例。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。特别是,要发布您的测试和调试结果,以及生成它的代码。 - Prune
显示剩余2条评论
5个回答

2
尝试保存新的(返回的)字符串,而不是忽略它。
s = s.replace(t,"");

replace返回一个新字符串;你似乎认为它会直接修改原有字符串。


我现在只能通过3/14个测试用例 :( - Prakhar Saxena
@PrakharSaxena,你没有正确阅读挑战。如果只是重复删除字符串,编程挑战就不会那么难了。这个挑战是关于找到从一个字符串中删除子字符串的最大可能移动次数。如果你从左边开始,你可能得到不同数量的子字符串,而当你从右边开始时则不同。 - Ismail

0

尝试添加一些简单的参数检查。字符串不应等于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;
}

0

在代码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;
}

0

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

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

s =“abcabcabab”; t =“abcab”

您的答案1 期望的答案2

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

但实际答案应该是2 第一步,在s的索引3处删除t, s将减少为“abcab”,计数= 1。

第二步从索引0中删除t, s将减少为“”,计数= 2。

所以答案应该是2。

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


0
   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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接