【leetCode 21】 括号生成(回溯算法)

49 阅读1分钟
function generateParenthesis(n: number): string[] {
  // 采用回溯算法
  const ans: string[] = [];
  /**
   * @param {number} lRemain :左括号剩余数量
   * @param {number} rRemain :右括号剩余数量
   * @param {string} str  :最后生成的结果
   */
  function dfs(lRemain: number, rRemain: number, str: string) {
    //单个分支的括号字符构建完成
    if (str.length === 2 * n) {
      ans.push(str);
      return;
    }
    //如果左括号还有剩余,则使用
    if (lRemain > 0) {
      dfs(lRemain - 1, rRemain, str + "(");
    }
    //如果右括号的剩余数量大于左括号,((  ))) ,说明 str里左括号更多,则可以使用右括号
    if (rRemain > lRemain) {
      dfs(lRemain, rRemain - 1, str + ")");
    }
  }
  //递归入口
  dfs(n, n, "");
  return ans;
}
 
console.log(generateParenthesis(3));