2011-04-17 96 views

回答

8

這將是很有誘惑力的使用.replace(),但如果你更換)(,然後用)(會與所有)結束。相反,遍歷字符串,並使用StringBuilder來構建你的字符串。

String swapParens(String s) { 
    StringBuilder sb = new StringBuilder(); 
    sb.ensureCapacity(s.length()); // preallocate to prevent resizing 
    for(int i = 0; i < s.length(); i++) { 
     char c = s.charAt(i); 
     switch(c) { 
      case ')': sb.append('('); break; 
      case '(': sb.append(')'); break; 
      default: sb.append(c); 
     } 
    } 
    return sb.toString(); 

} 

我知道你可以把東西在那裏,一個佔位符交換,但如果它已經存在於你的字符串中, d有一個大問題。

考慮使用「xxx」作爲交換字符串。如果你的字符串是「abcx(yz)」,並且你替換(用xxx,你最終得到「abcxxxyz)」然後你替換成)(所以你有「abcxxxxyz(」。然後你用xxx替換),所以你有「 ABC)XYZ(」當然不是很酷!

+1

這當然是最正確的方法。實際上,它可能是最有效的方式,因爲字符串只被複製一次。 – 2011-04-17 21:42:05

+2

我喜歡你的例子,顯示原始字符串中不包含'xxx'可能會導致麻煩。 – 2011-04-17 21:43:24

+0

我只是建議增加容量到StringBulder ctor以避免重新分配:StringBuilder(s.length())(更新:被添加) – 2011-04-17 21:47:43

3

如何

text.replace("(", "xxx").replace(")", "(").replace("xxx",")") 

其中xxx是肯定不會在字符串中出現的東西。

+0

如何保證一個特定的子串永遠不會發生? – corsiKa 2011-04-17 21:33:47

+0

那麼,我們可以保證,在特定類型的文本中出現特定的長子串的預期時間是宇宙死亡後的某個時間。 – 2011-04-17 21:45:21

1

你可以先用一個未使用的字符替換"(" ,然後")""(",然後與")"的未使用的字符:

String swapParens(String s) { 
    return s.replace('(', '\0').replace(')', '(').replace('\0', ')'); 
} 

但是,如果字符串中已經有一個空字符,那將不起作用,所以它不是一個好的通用解決方案。

否則,你可以使用glowcoder的方法,但什麼可能是更有效的獲得字節到一個數組,自己更換它們,然後重新構建字符串:

String swapParens(String s) { 
    char[] bytes = s.toCharArray(): 
    for (int i=0; i < bytes.length; ++i) { 
     if (bytes[i]=='(') bytes[i] = ')'; 
     else if (bytes[i]==')') bytes[i] = '('; 
    } 
    return new String(bytes); 
} 
0

如果有一個字符你永遠不會在字符串中找到,你可以使用.replace(')', 'unusedChar').replace('(', ')').replace('unusedChar', '(');

1
StringBuffer str = new StringBuffer(text); 
for(int i=0; i<str.length(); i++){ 
   if(str.charAt(i)=='(') srt.setCharAt(i,')'); 
   else if(str.charAt(i)==')') str.setCharAt(i,'('); 
} 
text = str.toString();