如果给定的序列有效,则以下函数必须返回 true。为什么此函数不为“||”序列返回 true?

Following function must return true if given sequence is valid. Why this function doesn't return true for "||" sequence?

提问人:Muxa 提问时间:1/7/2023 最后编辑:Muxa 更新时间:1/14/2023 访问量:44

问:

函数必须为“()”序列返回 true,为“[)”序列返回 false,因此它确实如此。但是为什么这个函数不对“||”序列返回 true?你能帮忙吗?

我写了这段代码,但没有任何效果:(

function check(s) {
  const brackets = {
    ")": "(",
    "]": "[",
    "}": "{",
    "|": "|",
  };
  const st = [];
  for (let i = 0; i < s.length; i++) {
    if (isClosedBracket(s[i])) {
      if (brackets[s[i]].toString() !== st.pop()) {
        return false;
      }
    } else {
      st.push(s[i]);
    }
  }
  return st.length === 0;
}
//if bracket is in this array, function returns true, so bracket is closing
function isClosedBracket(ch) {
  return [")", "]", "}", "|"].indexOf(ch) > -1;
}
JavaScript 序列

评论

0赞 Parzh from Ukraine 1/7/2023
作为一般建议,尝试更频繁地使用命名变量,而不是就地表达式。这提高了代码的可读性(和“可理解性”),因此您将来不会遇到此类问题。
0赞 Nina Scholz 1/7/2023
|没有方向......

答:

0赞 MichiBros 1/7/2023 #1

好吧,由于管道序列“||”使用相同的字符来打开和关闭,那么当第一个 |(开头的那个)将遇到,将执行右括号的代码块。

您的代码可以正常工作,但如果开始字符与结束字符相同,则代码将无法正常运行。如果您绝对需要此功能,请考虑在此特定情况下添加更多检查。

但是,代码会变得更加复杂,因为单数 |也可能意味着错误序列中的右括号,因此像“(|)”这样的输入处理起来会有点复杂。

0赞 Muxa 1/14/2023 #2

谢谢大家!我通过添加另一个 if/else 块解决了这个问题。这是解决方案,如果你需要它=3

function check(str) {
 let stack = [];
 for (let i = 0; i < str.length; i++) {
   if (
     +str[i] === 1 ||
     +str[i] === 3 ||
     +str[i] === 5 ||
     str[i] === "(" ||
     str[i] === "[" ||
     str[i] === "{"
   ) {
     stack.push(str[i]);
   } else if (
     (+str[i] === 2 && stack.at(-1) === "1") ||
     (+str[i] === 4 && stack.at(-1) === "3") ||
     (+str[i] === 6 && stack.at(-1) === "5") ||
     (str[i] === ")" && stack.at(-1) === "(") ||
     (str[i] === "]" && stack.at(-1) === "[") ||
     (str[i] === "}" && stack.at(-1) === "{")
   ) {
     stack.pop();
   } else if (str[i] !== stack.at(-1)) {
     stack.push(str[i]);
   } else {
     stack.pop();
   }
 }

 return !stack.length > 0;
}

有什么想法如何改进这个代码吗?