JS-如何找到最深括号对的索引?

时间:2019-02-06 14:17:52

标签: javascript nested parentheses

我有一个字符串: "5 * ((6 + 2) - 1)" 我需要找到最深的一对括号及其内容。

我在Google上搜索了很多东西,但是找不到关于索引的特定内容。许多解决方案都发现有多少个级别,诸如此类,但没有什么真正有用的。我本来想计算层数,然后使用循环求解并重复求解直到完成,但这似乎真的很慢。

我不知道从哪里开始,所以我还没有编写任何代码。

我想要一个函数返回5,即最深括号集合的字符串索引。我也需要对最深的“)”做同样的事情,因为我需要一对。示例:

const deepestPair = (str) => {
    // Find deepest pair of parentheses
}
deepestPair("(2(5)4)(3)") // Returns [2, 4], the indexes of the deepest open/close parentheses

3 个答案:

答案 0 :(得分:4)

您可以检查左括号和右括号,并使用计数器来获取嵌套最多的索引。

const deepestPair = str => {
    var indices,
        max = 0,
        count = 0,
        last;
    
    [...str].forEach((c, i) => {
        if (c === '(') {
            last = i;
            count++;
            return;
        }
        if (c === ')') {
            if (count > max) {
                indices = [last, i];
                max = count;
            }
            count--;
        }
    });    
    return indices;
}

console.log(deepestPair("(2(5)4)(3)")); // [2, 4]

答案 1 :(得分:1)

您可以使用RegExp ([(])[^()]+[)]来匹配(,后跟一个或多个不是()的字符并关闭)/[)]/以匹配右括号,并返回匹配的索引

const deepestPair = (str, index = null) => 
  [index = str.match(/([(])[^()]+[)]/).index
  , str.slice(index).match(/[)]/).index + index]

console.log(deepestPair("(2(5)4)(3)"));

答案 2 :(得分:1)

这是使用两个堆栈获得最深对的简单方法。它还返回具有openclose索引的结构对中的深度。

它使用singles堆栈来保存到目前为止找到的开放括号,并使用另一个堆栈(pairs)来匹配括号。

每次找到右括号时,最后一个打开的括号将从singles堆栈中弹出并放入pairs

然后,您只需要使用pairs属性对此depth堆栈进行排序即可获得第一项。

const deepestPair = str => {
  const singles = [];
  const pairs = [];

  [...str].forEach((c, i) => {
    if (c === '(') {
      singles.push({ depth: singles.length + 1, open: i });
    } else if (c === ')' && singles.length) {
      pairs.push({ ...singles.pop(), close: i });
    }
  })

  pairs.sort((a, b) => b.depth - a.depth);

  return pairs.length ? pairs[0] : {};
};

console.log(deepestPair('(2(5)4)(3)'));
console.log(deepestPair('(2(5)(1)(11(14))4)(3)'));

如果要获取数组结果,可以用以下内容替换最后一行:

return pairs.length ? [pairs[0].open, pairs[0].close] : [];