【问题标题】:Repeatedly removing a substring from a string反复从字符串中删除子字符串
【发布时间】:2018-04-01 21:59:16
【问题描述】:

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

示例: 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 例。

谁能帮我弄清楚我没有涵盖哪些案例?

【问题讨论】:

标签: java string recursion substring


【解决方案1】:

例如,您可以将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);

【讨论】:

  • 不幸的是,我最终只通过了 3/14 个测试用例。
  • @AbdullahKhan 尝试使用replaceFirst 而不仅仅是replace
  • 如果t 包含特殊的正则表达式字符怎么办?
  • 很好,现在它可以正常工作了(我认为)。但我非常喜欢 Frank Underwood 用 String.replace() 解决问题的方式。
  • 这是我认为的最佳答案,我只需要考虑边缘情况,例如输入中有空格。感谢您的帮助!
【解决方案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());

【讨论】:

  • 如果我要将替换放在一个循环中,因为我试图返回字符串被替换次数的计数,我是否会将 Sysout 中的内容放入一段时间环形?像,while((oldstr.length()-s.length())/x.length()) != 0) { count++;或者这完全不符合标准。
  • @AbdullahKhan 我真的不知道你想说什么。只需将(oldstr.length()-s.length())/x.length() 放入变量中。这是最后的计数。
  • 哦,你是对的,我看错了你写的东西。不幸的是,您的解决方案仅通过了 3/14 个测试用例
  • @AbdullahKhan 肯定有一些边缘情况。考虑他们。代码很好
【解决方案3】:

一种简单有效的方法是在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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-20
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多