https://leetcode-cn.com/problems/generate-parentheses/

dfs + 剪枝

为什么要费劲的设置两个参数leftSizes和rightSizes在我的递归函数里头?

  • 剪枝呗
  • 如果你不这样,每个位置都可以选择左括号或者右括号,到最后再来检查它合不合法。很耗时间
  • 加了这两个参数,我们在中间就可以给它提前剪枝了。就很快 ```java public List generateParenthesis(int n) { List list = new ArrayList<>(); char[] path = new char[n << 1]; dfs(0, n, n, path, list); return list; }

public void dfs(int idx, int leftSizes, int rightSizes, char[] path, List list) { if (idx == path.length) { list.add(String.valueOf(path)); return; } //枚举这一层可能的所有选择,选择一种可能之后,进入下一层搜索 // 选择’(‘ if (leftSizes > 0 ) { path[idx] = ‘(‘; dfs(idx + 1, leftSizes - 1, rightSizes, path, list); } // 当(和)数量一样时,只能选择( if (rightSizes > 0 && rightSizes != leftSizes) { path[idx] = ‘)’; dfs(idx + 1, leftSizes, rightSizes - 1, path, list); } }

  1. - **如果不剪枝就是这样的**
  2. ```java
  3. public List<String> generateParenthesis(int n) {
  4. List<String> list = new ArrayList<>();
  5. char[] path = new char[n << 1];
  6. dfs1(0, path, list);
  7. return list;
  8. }
  9. public void dfs1(int idx, char[] path, List<String> list) {
  10. if (idx == path.length) {
  11. if (isValid(path)) {
  12. list.add(String.valueOf(path));
  13. return;
  14. }
  15. return;
  16. }
  17. path[idx] = '(';
  18. dfs1(idx + 1, path, list);
  19. path[idx] = ')';
  20. dfs1(idx + 1, path, list);
  21. }
  22. private boolean isValid(char[] path) {
  23. int count = 0;
  24. for (char c : path) {
  25. if (c == '(') {
  26. count++;
  27. } else {
  28. count--;
  29. }
  30. if (count < 0) {
  31. return false;
  32. }
  33. }
  34. return count == 0;
  35. }

这道题如果要求返回的是合法括号数量有多少个,而不要求求出具体的,那么这道题就是卡特兰数