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

时间:2017-10-20 17:08:30

标签: java string recursion substring

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

示例: t = abs = aabb。在第一步中,我们会检查t中是否包含s。这里,t包含在中间,即a(ab)b。因此,我们将删除它,结果将为ab并将计数值增加1。我们再次检查t中是否包含s。现在,t等于s,即(ab)。因此,我们从s中删除它并递增计数。因此,由于t中不再包含s,我们会停止并打印计数值,在这种情况下为2

我尝试使用递归来解决这个问题

static int maxMoves(String s, String t) {
    if ( null == s || "" == s || null == t || "" == t){
           return 0;
    }
    int i = s.indexOf(t);
        if(i != -1) {
            return maxMoves(s.substring(0, i)+ s.substring(i+t.length(),                            s.length()), t) + 1;
        } else {
            return 0;
        }

    }

但我只传递了9/14个测试用例。我也试过这个,

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;
}

但这也只通过了9/14例。

有谁可以帮我弄清楚我没有涉及哪些案件?

3 个答案:

答案 0 :(得分:4)

只需将String::replaceFirstwhile循环一起使用即可:

String s = "aabb";
String t = "ab";
int count = 0;
while (s.contains(t)) {
    s = s.replaceFirst(Pattern.quote(t), "");
    count++;
}

System.out.println(count);

答案 1 :(得分:2)

使用String#replace

String s = "aabb";
String oldstr = s;
String x = "ab";
while(s.contains(x)){
    s = s.replace(x, "");
}
System.out.println((oldstr.length()-s.length())/x.length());

答案 2 :(得分:1)

一种简单有效的方法是在StringBuilder中逐字符累积字符串;如果在任何时候其缓冲区以您要替换的字符串结尾,请将其删除:

StringBuilder sb = new StringBuilder();
int c = 0;
for (int i = 0; i < s.length(); ++i) {
  sb.append(s.charAt(i));
  int last = sb.length()-t.length();
  if (last >= 0 && sb.indexOf(t, last) == last) {
    sb.setLength(last);
    ++c;
  }
}
// c is now the number of times you removed t from s.