为什么不能使用换码符替换所有的括号?

问题描述:

我试图取代他们背对支架为我采取解决上Hackerrank.com编码挑战的所有方括号中here.为什么不能使用换码符替换所有的括号?

我觉得有一个解决的挑战,但我似乎无法得到替换所有功能,以正常工作我的功能。我试过使用Pattern.quote(String)以及反斜杠,但由于某些原因,我的括号没有被替换。

public class Solution { 

    public static boolean isBalanced(String expression) { 

     if(expression.length() %2 != 0) { 
      return false; 
     } 
     else { 

      int middle = expression.length() /2; 
      String open = expression.substring(0,middle); 
      String close = expression.substring(middle); 

      close.replaceAll("\\)", "\\("); 
      close.replaceAll(Pattern.quote("}"),"{"); 
      close.replaceAll(Pattern.quote("]"), "["); 
      new StringBuilder(close).reverse().toString(); 

      if(close.equals(open)) 
       return true; 
      else 
       return false; 
     } 
    } 

    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     int t = in.nextInt(); 
     for (int a0 = 0; a0 < t; a0++) { 
      String expression = in.next(); 
      System.out.println((isBalanced(expression)) ? "YES" : "NO"); 
     } 
    } 
} 

编辑:我测试了打印语句的代码行后new StringBuilder(close).reverse().toString();

输入:

3 
{[()]} 
{[(])} 
{{[[(())]]} 

输出:

)]} 
NO 
])} 
NO 
))]]}} 
NO 
+0

我使用打印语句对其进行了测试。字符串根本不会改变。 – Remixt

String Java中的对象是不可变的,因此在其中执行替换命令不会更改源String,而是返回已修改的新String

让你的线条像这样

close.replaceAll("\\)", "\\("); 

,而不是像这样

close = close.replaceAll("\\)", "\\("); 

与修改String对象更新close变量的值。


同样,String这里创建被分配给了什么和将被丢弃:

new StringBuilder(close).reverse().toString(); 

您需要分配创建String地方,例如

close = new StringBuilder(close).reverse().toString(); 
+0

我不敢相信我犯了这样一个愚蠢的错误。感谢您的支持! – Remixt

您的解决方案是根本错误的,因为它容易出现误报。

具体来说,这个字符串会产生"YES",而串显然是不平衡的:

[({{(] 

后你劈成两半,你将有"[({""{(]"的字符串。在关闭部分替换字符后,您将有"{([",在逆转后变为"[({"。转换的结果与字符串的前半部分相匹配,所以你的代码会错误地推断字符串中的括号是匹配的。

+0

感谢您挑战挑战!我仍然想知道为什么我的代码在任何情况下都不会返回true。 – Remixt