代码实现

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
    }