递归 求能构成合法括号串的数量

89 阅读1分钟

题目

给定一个数组,数组元素为1表示当前位置是左括号,元素为0表示当前可以是左括号也可以是右括号,求最终能构成的合法括号串的数量

  • '(())' 和 '(())()' 都是合法括号串

  • 合法括号串需要满足两个条件:

    • 任意位置停止的前缀,都满足左括号数量大于等于右括号数量
    • 整个字符串左括号数量和右括号数量相等
  • 递归模型为从左往右遍历,记录当前位置左括号比右括号数量多多少

// i 来到的位置
// j [0,i-1]区间里左括号比右括号多多少个
function process(arr, i, j) {
  // 来到终止位置时,左括号比右括号多0个表示合法
  if (i === arr.length) {
    return j === 0 ? 1 : 0;
  }

  // 任何一个时刻前缀的左括号都不能小于右括号数量
  if (j < 0) {
    return 0;
  }

  // 剩余字符数量比左括号多余数量少
  if (arr.length - i < j) {
    return 0;
  }

  // 说明是左括号
  if (arr[i] !== 0) {
    return process(arr, i + 1, j + 1);
  } else {
    // 当前位置选左括号
    let p1 = process(arr, i + 1, j + 1);
    // 当前位置选右括号
    let p2 = process(arr, i + 1, j - 1);
    return p1 + p2;
  }
}

process(arr, 0, 0);