2017-10-05 39 views
0

我試圖取代他們背對支架爲我採取解決上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

回答

2

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

2

您的解決方案是根本錯誤的,因爲它容易出現誤報。

具體來說,這個字符串會產生"YES",而串顯然是不平衡的:

[({{(] 

後你劈成兩半,你將有"[({""{(]"的字符串。在關閉部分替換字符後,您將有"{([",在逆轉後變爲"[({"。轉換的結果與字符串的前半部分相匹配,所以你的代碼會錯誤地推斷字符串中的括號是匹配的。

+0

感謝您挑戰挑戰!我仍然想知道爲什麼我的代碼在任何情況下都不會返回true。 – Remixt