返回轨道
算法 · 2026-05-14 · 23 阅读

P29 括号的合法排列

算法 23 阅读

信号摘要

难度:Medium · 时长:09:36 · leetcode 22 · lintcode 427

P29 括号的合法排列

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你 n 对括号,你要返回这 n 对括号的所有合法排列方式。

比如说,n 等于 3 时,合法的排列有 5 个:

((())) (()()) (())() ()(()) ()()()

代码

public class AlgoCasts {

  private void generate(List<String> result, String str, int left, int right) {
    if (left == 0 && right == 0) {
      result.add(str);
    } else {
      if (left > 0) generate(result, str + '(', left - 1, right);
      if (right > left) generate(result, str + ')', left, right - 1);
    }
  }

  // Time: O(4^n / sqrt(n)), Space: O(n)
  public List<String> generateParentheses(int n) {
    if (n <= 0) return new ArrayList<>();
    List<String> result = new ArrayList<>();
    generate(result, "", n, n);
    return result;
  }

  // Time: O(4^n / n*sqrt(n)), Space: O(4^n / n*sqrt(n))
  public List<String> generateParenthesesDP(int n) {
    if (n <= 0) return new ArrayList<>();
    List<List<String>> d = new ArrayList<>(n+1);
    for (int i = 0; i < n+1; ++i) d.add(new ArrayList<>());
    d.get(0).add("");
    for (int i = 1; i < n+1; ++i)
      for (int j = 0; j < i; ++j)
        for (String left: d.get(j))
          for (String right: d.get(i-j-1))
            d.get(i).add('(' + left + ')' + right);

    return d.get(n);
  }

}

📡 通讯频道