题目
给定一个数组,数组元素为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);