解法一:DFS
合法的括号顺序要保证每次添加新括号都满足左括号数量大于右括号,因此根据当前左右括号数量来决定下一步递归可以添加哪种括号。
import java.util.LinkedList;
import java.util.List;
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new LinkedList<>();
dfs(n, n, ans, new StringBuilder());
return ans;
}
/**
* @param left 当前还可以添加的左括号数量
* @param right 当前还可以添加的右括号数量
* @param ans 答案数组
* @param str 当前字符串
*/
private void dfs(int left, int right, List<String> ans, StringBuilder str) {
if ((left == 0) && (right == 0)) {
ans.add(str.toString());
return;
}
if (left == 0) {
dfs(left, right - 1, ans, str.append(')'));
str.deleteCharAt(str.length() - 1);
} else if (left == right) {
dfs(left - 1, right, ans, str.append('('));
str.deleteCharAt(str.length() - 1);
} else if (left < right) {
dfs(left - 1, right, ans, str.append('('));
str.deleteCharAt(str.length() - 1);
dfs(left, right - 1, ans, str.append(')'));
str.deleteCharAt(str.length() - 1);
}
}
}