You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何自定义括号校验函数无法对序列“||”返回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

代码说明

  1. 把|从原有的闭合括号列表中移除,用doubleBrackets集合单独管理这类双向括号
  2. 遍历字符时优先判断是否为双向括号:
    • 栈顶和当前字符相同时,说明配对成功,弹出栈顶
    • 否则将当前字符压入栈,等待后续配对
  3. 普通括号的校验逻辑保持原有逻辑,确保兼容性

这样修改后,既能正确处理普通括号的校验,也能支持||这类双向括号的场景。

内容的提问来源于stack exchange,提问作者Muxa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:10:13