重复删除字符串中的子字符串

时间:2017-09-11 17:14:33

标签: java string algorithm replace substring

问题: 重复从字符串t中删除子字符串s并打印所涉及的步骤数。

说明/工作:

  

例如: 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,""));)。我没有相同的理由。

  3. 因为,我只传递了9/14个测试用例,所以必然会出现一些导致“错误答案”的逻辑错误。如果我使用 Code 1 ,我该如何克服这个问题?如果我使用 Code 2 ,我该如何避免无限执行“Marked Statement”?或者是否有人想建议我 Code 3

    提前谢谢你:)

5 个答案:

答案 0 :(得分:2)

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

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

替换会返回一个新字符串;你似乎认为它会就地改变给定的字符串。

答案 1 :(得分: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;
}

答案 2 :(得分: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;
}

答案 3 :(得分: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);

答案 4 :(得分: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。

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