我有一个字符串:
"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
答案 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)
这是使用两个堆栈获得最深对的简单方法。它还返回具有open
和close
索引的结构对中的深度。
它使用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] : [];