【LeetCode】 22 有效括號
阿新 • • 發佈:2018-12-04
解題思路:
1 最樸素的想法是:對每種可能出現的序列情況排列組合,將最後不符合條件的情況剔除。
2 回溯法:和上方的思路差不多,但是隻要在組建字串的過程中,出現了不符合要求的情況,直接將其丟棄。
3 所有序列可以被看成是一個二叉樹,根節點是空字串,左孩子加左括號,右孩子加右括號。每個結果都對應了樹裡的一個從根到節點的序列。對每個節點進行丟棄分析,需要我們把字串形成過程中每加一個左/右括號的情況都拿出來分析。綜上所述,遞迴比較符合我們的需求。
程式碼:
class Solution { public List<String> generateParenthesis(int n) { List<String> result = new ArrayList<>(); getParentheses(result,n,"",0,0); return result; } void getParentheses(List<String> result, int max, String nowStr, int haveLeft, int haveRight){ if (haveLeft + haveRight == max*2){ result.add(nowStr); return; } if (haveLeft < max){ getParentheses(result, max, nowStr+"(", haveLeft+1, haveRight); } if (haveRight < haveLeft){ getParentheses(result, max, nowStr+")", haveLeft, haveRight+1); } } }