Solution 1: 递归回溯法
回溯就是找到所有的解,一直没用java写过回溯,突然有点懵逼
一直往左下走
if (open < max)
backtrack(ans, cur+"(", open+1, close, max);
cur还是左下之前的值,再继续往右下走
if (close < open)
backtrack(ans, cur+")", open, close+1, max);
这个类似与0-1背包问题,时间复杂度是0(2的h(n)次方),其中h(n)是一条路径的长度,在这一题就是2n。所以时间复杂度是2的2n次方也就是O(4的n次方)
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList();
backtrack(ans, "", 0, 0, n);
return ans;
}
public void backtrack(List<String> ans, String cur, int open, int close, int max){
if (cur.length() == max * 2) {
ans.add(cur);
return;
}
if (open < max)
backtrack(ans, cur+"(", open+1, close, max);
if (close < open)
backtrack(ans, cur+")", open, close+1, max);
}
}
Solution 2: 巧妙的递归
其中left和right都是有效的string
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList();
if (n == 0) {
ans.add("");
} else {
for (int c = 0; c < n; ++c)
for (String left: generateParenthesis(c))
for (String right: generateParenthesis(n-1-c))
ans.add("(" + left + ")" + right);
}
return ans;
}
}