2016-08-21 58 views
0

任何人都可以提出解決這個編碼難題的最佳方法嗎? 我用了一堆if語句,並被告知只增加了圈複雜度。解決方案是正則表達式還是數據結構(如堆棧)?任何反饋非常感謝。有效的Parens方法 - Java

/** 
* Write a function that will take a string as input and output 
* a boolean (true or false) that describes if the string has valid parens. 
* 
* Use Cases: 
* 
* "" -> false 
* 
* null -> false 
* 
* "()" -> true 
* 
* ")" -> false 
* 
* "(" -> false 
* 
* "(())" -> true 
* 
* "())(" -> false 
* 
* "()))" -> false 
* 
* ")(" -> false 
* 
* "()()" -> true 
*/ 
public boolean validParen(String input) { 
    // implementation? 
} 
+0

試着寫,執行下一個操作的功能:'(州,符號) - 其中'state'包含已經介紹> state',經過處理的「輸入」(至少其正確性),「符號」是「輸入」的下一個字符。 – user3707125

+0

如果找到非父母字符,應該返回什麼? – Andreas

+0

我開始看每個字符,計算左**(**和右**)**(單獨)的數量(顯然從字符串的開始到結束)。如果結果爲0,則爲false。如果結果相同,則不是錯誤的。然而,如果權利的數量比左派的數量多,那麼立刻就會失敗。沒有完全檢查有效性,但這是一個開始。這將利用一個循環。 – MikeT

回答

1

你只需要一個計數器。

如果輸入爲空或空字符串,則返回false。

然後迭代字符串的字符,並在看到(時遞增計數器,並在看到)時遞減計數器。

如果您看到)且計數器爲零,則返回false。
如果計數器最後不爲零,則返回false。
否則返回true。

2

要簡單地檢查括號是否有效(成對),您並不需要任何數據結構。當你遇到一個時,只需增加一個計數器變量(並在找到它時對它進行遞減)。在結束時,計數器應= 0,如果(和)是平衡的:

static boolean check(String toCheck) { 
    if (toCheck == null || toCheck.equals("")) 
     return false; 
    int count = 0; 
    for (int i = 0; i < toCheck.length(); i++) { 
     char c = toCheck.charAt(i); 
     if (c == '(') { 
      count++; 
     } else if (c == ')') { 
      if (count == 0) 
       return false; 
      count--; 
     } 
    } 
    return count == 0; 
} 
+1

這對於下列值是失敗的:'null',''''''')(「'等等。另外,爲什麼不使用'for'循環? – Andreas

+0

@Andreas顯然我沒有考慮所有的用例,根據你的建議編輯,謝謝修正。 –

+0

'toCheck.equals(「」)'最好寫成'toCheck.isEmpty()'。 – Andreas