#22 括號生成
數字 n 代表生成括號的對數,請你設計一個函數,用於能夠生成所有可能的並且 有效的 括號組合。
示例:
輸入:n = 3
輸出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路:
- 生成括號就是典型的回溯算法。
- 也可以叫深度遍歷。
- 搭配合理的剪枝
- 從空白字符串開始,遞歸地添加左括號或右括號。
- 如果左括號的數量大於n或者數量小於右括號的數量,剪枝。
代碼:
LeetCode版代碼
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<String>();
generate(res, "", 0, 0, n);
return res;
}
//count1統計“(”的個數,count2統計“)”的個數
public void generate(List<String> res , String ans, int leftCount, int rightCount, int n){
//括號數量超過了n,結束遞歸。
if(leftCount > n || rightCount > n) return;
//如果左括號和右括號數量相等且都爲n,將這個序列添加進結果,剪枝。
if(leftCount == n && rightCount == n) {
res.add(ans);
return;
}
/*
如果左括號數量不小於右括號數量,也隱含了剪枝。
其實省略了下面這行代碼
if(leftCount < rightCOunt) return;
*/
if(leftCount >= rightCount){
//加一個左括號
generate(res, ans+"(", leftCount+1, rightCount, n);
//加一個右括號
generate(res, ans+")", leftCount, rightCount+1, n);
}
}
}
idea版代碼
import java.util.ArrayList;
import java.util.List;
public class number_22 {
public static void main(String[] args) {
List<String> l;
l = generateParenthesis(1);
System.out.println(l);
}
public static List<String> generateParenthesis(int n){
List<String> l = new ArrayList<>();
generate(l,"",0,0,n);
return l;
}
public static void generate(List<String> res, String ans, int leftCount, int rightCount, int n){
//如果左側括號數量或右側括號數量大於n,剪枝
if(leftCount>n || rightCount>n) return;
//如果括號匹配到n個,添加到結果中,剪枝。
if(leftCount == n && rightCount == n) {
res.add(ans);
return;
}
/*
左側括號數量大於等於右側括號數量,也隱含了剪枝。
其實省略了下面這行代碼
if(leftCount < rightCOunt) return;
*/
if(leftCount>=rightCount){
generate(res,ans+"(",leftCount+1,rightCount,n);
generate(res,ans+")",leftCount,rightCount+1,n);
}
}
}