1.題目描述
給出 n 代表生成括號(hào)的對(duì)數(shù),請(qǐng)你寫出一個(gè)函數(shù),使其能夠生成所有可能的并且有效的括號(hào)組合。
例如,給出 n = 3,生成結(jié)果為:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
2.思路分析
如果是對(duì)n個(gè)字符排列,總共有多少種排序方法?一共有n!種。
那現(xiàn)在問題變了,字符只有兩種'(' 和 ')',并且我們要考慮到,要滿足括號(hào)的合理性。兩次剪枝。
用樹來枚舉所有的可能:
樹組織方式
DFS:
①總共有n個(gè)左括號(hào)和n個(gè)右括號(hào)
②當(dāng)左括號(hào)小于n的時(shí)候可以繼續(xù)添加:(
③當(dāng)右括號(hào)使用數(shù)小于左括號(hào)的時(shí)候,可以添加:)
結(jié)束條件:沒有右括號(hào)可以使用了
3.代碼實(shí)現(xiàn)
public static List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<>();
if (n <= 0) return list;
getParenthesis("",n,list,0,0);
return list;
}
public static void getParenthesis(String cur,int n, List<String> list, int left, int right) {
if(right==n){
list.add(cur);
return;
}
if(left<right)return;
if(left>right){
getParenthesis(cur+")",n,list,left,right+1);
}
if(left<n){
getParenthesis(cur+"(",n,list,left+1,right);
}
}