为何自定义括号校验函数无法对序列“||”返回true?
问题分析与解决:括号校验函数无法处理"||"的问题
问题原因
你当前的逻辑把|直接归为闭合括号,但|和普通括号(比如()/[])不一样——普通括号是明确的“左开右闭”配对,而|是双向的,既可以作为开括号,也可以作为闭括号。
当处理"||"时,第一个|会被isClosedBracket判定为闭合括号,此时栈st是空的,st.pop()返回undefined,和brackets["|"]对应的"|"不相等,直接返回false,这就是校验失败的核心原因。
解决办法
我们需要单独处理|的配对逻辑:遇到|时,先检查栈顶元素是不是|——如果是,说明找到了配对,弹出栈顶;如果不是,就把当前|压入栈。普通括号的逻辑保持不变。
修改后的代码如下:
function check(s) { const brackets = { ")": "(", "]": "[", "}": "{", }; // 单独管理双向括号 const doubleBrackets = new Set(["|"]); const st = []; for (let i = 0; i < s.length; i++) { const ch = s[i]; if (doubleBrackets.has(ch)) { // 双向括号处理:栈顶匹配则弹出,否则压入 if (st[st.length - 1] === ch) { st.pop(); } else { st.push(ch); } } else if (brackets.hasOwnProperty(ch)) { // 普通闭合括号处理 if (brackets[ch] !== st.pop()) { return false; } } else { // 普通开括号压栈 st.push(ch); } } return st.length === 0; } // 测试验证 console.log(check("()")); // true console.log(check("[)")); // false console.log(check("||")); // true console.log(check("|()|")); // true console.log(check("|(|)")); // false
代码说明
- 把
|从原有的闭合括号列表中移除,用doubleBrackets集合单独管理这类双向括号 - 遍历字符时优先判断是否为双向括号:
- 栈顶和当前字符相同时,说明配对成功,弹出栈顶
- 否则将当前字符压入栈,等待后续配对
- 普通括号的校验逻辑保持原有逻辑,确保兼容性
这样修改后,既能正确处理普通括号的校验,也能支持||这类双向括号的场景。
内容的提问来源于stack exchange,提问作者Muxa
相关产品推荐
相关产品推荐

