反复从字符串中删除子串

反复从字符串中删除子串

问题描述:

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

实施例:t = abs = aabb。在第一步中,我们检查t是否包含在s之内。这里,t包含在中间,即a(ab)b。因此,我们将删除它,结果将为ab并将计数值增加1。我们再次检查s是否包含t。现在,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例。

任何人都可以帮我找出哪些情况下我不覆盖?

+0

[字符串替换#(https://docs.oracle:如果在它的缓冲区要替换字符串结尾的任何时候,将其删除。 com/javase/7/docs/api/java/lang/String.html#replace(java.lang.CharSequence,%20java.lang.CharSequence)) –

+2

'“”== s' - > [如何比较字符串在Java?](https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java),或在这种情况下's.isEmpty()'更清晰。 – Pshemo

+0

是的,我改变了它,但仍然只有9/14例正在通过。我不认为空串被检查。 –

只要您可以使用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); 
+0

不幸的是,我最终只通过了3/14测试用例。 –

+0

@AbdullahKhan尝试使用'replaceFirst'而不是'replace' –

+1

如果't'包含特殊的正则表达式字符怎么办? –

一个简单而有效的方式是累积串字符一个字符在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. 

使用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()); 
+0

如果我要将替换放入循环中,因为我试图返回字符串被替换次数的计数,那么我会将Sysout中的内容放入while循环吗? ((oldstr.length() - s.length())/ x.length())!= 0){count ++; }或者是完全离开基地。 –

+2

@AbdullahKhan我真的不知道你想说什么。只需将'(oldstr.length() - s.length())/ x.length()'放在一个变量中。这是最后的计数。 –

+0

哦,你说得对,我误解了你的意思。您的解决方案只能通过3/14测试用例不幸 –