代码实现
1. JavaScript
/** @return 三维数据,一维元素为括号层级,按深度排序;二维元素为层级索引区间;三维元素分别为开始索引和结束索引,包含在内;
* @param brackets 用来表示括号字符集,元素为一对括号,用对象表示,left属性和right属性分别用来存放左右括号
*/
function getBracketRange(str: string, brackets: bracket[]) {
const stack: Array<string> = [];
let i = 0;
/** 一维元素为括号层级,按深度排序;
* 二维元素为层级索引区间;
* 三维元素分别为开始索引和结束索引,包含在内;
*/
let bracketRange: number[][][] = []
for (const ch of str) {
let bracketFlag = undefined
for (const b of brackets) {
if (ch == b.left) { bracketFlag = 'left'; break }
else if (ch == b.right) { bracketFlag = 'right'; break }
}
if (bracketFlag == 'left') {
stack.push(ch);
if (stack.length > bracketRange.length) bracketRange.push([])
bracketRange[stack.length - 1].push([i + 1])
}
else if (bracketFlag == 'right') {
if (stack.length == 0) throw new Error("右括号多余");
if (!this.match(stack.pop() as string, ch, brackets)) // 判断两个括号是否不匹配
throw new Error("左右括号种类不相同")
bracketRange[stack.length].slice(-1)[0].push(i - 1);
}
++i;
}
if (stack.length) throw new Error("左括号多余")
return bracketRange
}