22.括號生成
- 括號生成
難度中等969
數字 n 代表生成括號的對數,請你設計一個函數,用於能夠生成所有可能的並且 有效的 括號組合。
示例:
輸入:n = 3 輸出:[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
時間:O(2^n)
思路:如果遞歸生成括號,會出現很多無效的括號,因此 在遞歸的過程中過濾掉一些不符合條件的括號。規律就是 生成n 也就是2n個括號 由於都是小括號,因此 左括號 和右括號 應該是相等的。如果left < n 繼續 遞歸 由於一個右括號應該匹配一個左括號 當左括號 > 右括號 遞歸 當left 和 right == n的時候就停止 返回。
private List<String> result;//存儲結果
public List<String> generateParenthesis(int n) {
result = new ArrayList<String>();
generate("",0,0,n);
return result;
}
//在recursion中過濾掉不符合條件的括號。
public void generate(String str,int left,int right,int n){
//終止條件
if(left == n && right == n){
result.add(str);
return;
}
if(left < n){
generate(str+"(",left+1,right,n);
}
if(left > right){
generate(str+")",left,right+1,n);
}
}