2011-04-17 382 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();