给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
Java代码:
package com.swh.callable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//这个一定要自己把图画出来,嫌麻烦话n=2的n=4也可以,一定要标出每个节点中cur和open,close的值
//然后结果就一目了然了
public class LeetCode22 {
public static List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList();
backtrack(ans, "", 0, 0, n);
return ans;
}
public static void backtrack(List<String> ans, String cur, int open, int close, int max){
if (cur.length() == max * 2) {
ans.add(cur);
return;
}
//当左括号个数小于n的时候进行
if (open < max) {
backtrack(ans, cur+"(", open+1, close, max);
System.out.println(cur);
}
//当右括号小于左括号的时候
if (close < open){
backtrack(ans, cur+")", open, close+1, max);
}
}
public static void main(String[] args){
List<String> list = generateParenthesis(5);
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
其中每一个分支线都代表着一个判断,之所以能遍历出所有的结果是因为每一次backtrack()的时候cur的只包含了"(","((","()","()(","()()","(())",自己画图标明,然后理解就容易多了,靠想象总会觉得哪里不对劲