2017-10-20 71 views
0

問題:重複從字符串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例正在通過。我不認爲空串被檢查。 –

回答

3

只要您可以使用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'包含特殊的正則表達式字符怎麼辦? –

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

如果我要將替換放入循環中,因爲我試圖返回字符串被替換次數的計數,那麼我會將Sysout中的內容放入while循環嗎? ((oldstr.length() - s.length())/ x.length())!= 0){count ++; }或者是完全離開基地。 –

+2

@AbdullahKhan我真的不知道你想說什麼。只需將'(oldstr.length() - s.length())/ x.length()'放在一個變量中。這是最後的計數。 –

+0

哦,你說得對,我誤解了你的意思。您的解決方案只能通過3/14測試用例不幸 –

相關問題