解法一:DFS

合法的括号顺序要保证每次添加新括号都满足左括号数量大于右括号,因此根据当前左右括号数量来决定下一步递归可以添加哪种括号。

  1. import java.util.LinkedList;
  2. import java.util.List;
  3. class Solution {
  4. public List<String> generateParenthesis(int n) {
  5. List<String> ans = new LinkedList<>();
  6. dfs(n, n, ans, new StringBuilder());
  7. return ans;
  8. }
  9. /**
  10. * @param left 当前还可以添加的左括号数量
  11. * @param right 当前还可以添加的右括号数量
  12. * @param ans 答案数组
  13. * @param str 当前字符串
  14. */
  15. private void dfs(int left, int right, List<String> ans, StringBuilder str) {
  16. if ((left == 0) && (right == 0)) {
  17. ans.add(str.toString());
  18. return;
  19. }
  20. if (left == 0) {
  21. dfs(left, right - 1, ans, str.append(')'));
  22. str.deleteCharAt(str.length() - 1);
  23. } else if (left == right) {
  24. dfs(left - 1, right, ans, str.append('('));
  25. str.deleteCharAt(str.length() - 1);
  26. } else if (left < right) {
  27. dfs(left - 1, right, ans, str.append('('));
  28. str.deleteCharAt(str.length() - 1);
  29. dfs(left, right - 1, ans, str.append(')'));
  30. str.deleteCharAt(str.length() - 1);
  31. }
  32. }
  33. }