javascript 查找给定的一组括号是否有效

n8ghc7c1  于 2022-11-27  发布在  Java
关注(0)|答案(5)|浏览(119)

下面是我的代码,它适用于一些字符串,但不是所有.例如:“()()()()()(“预期为false,我的代码返回true。

function validParentheses(parens){
    var stack = [];

    parens.split('').map((cur, index) =>{
        if(stack.length === 0 || stack[index-1] === cur) stack.push(cur);
        else stack.pop();
  }); 

  return stack.length > 0 ?  false : true;
}
zysjyyx4

zysjyyx41#

stack[index - 1]将有效,只要你推送每一次迭代。在弹出一个元素的情况下,递增的索引将总是超出界限。
将其更改为stack.length - 1以始终获取最后一个元素,而不管推入或弹出的是什么。

esyap4oy

esyap4oy2#

对于每个“(”,必须有一个")“。因此,您需要一个计数器来查看是否存在完全匹配

function validParentheses(parens){
   
   const chars = parens.split('');
   const numChars = chars.length;
   
   let ii;
   let numOpenParens = 0;
   for (ii = 0; ii < numChars; ii += 1) {
       curChar = chars[ii];
       numOpenParens += curChar == '(' ? 1 : -1;
       // return false if there is one too many closed parens
       if (numOpenParens < 0) {
          return false;
       } 
   }

   // return true only if all parens have been closed
   return numOpenParens === 0;

}
yftpprvb

yftpprvb3#

对于堆栈长度大于0的情况:

  • 如果栈顶等于当前迭代的括号,则将其压入栈
  • 否则弹出堆栈
function validParentheses(parens) {
  var stack = []

  parens.split("").forEach((cur) => {
    if (stack.length > 0) {
      if (stack[stack.length - 1] === cur) {
        stack.push(cur)
      } else {
        stack.pop()
      }
    } else {
      stack.push(cur)
    }
  })

  return stack.length > 0 ? false : true
}

console.log(validParentheses("()()()()()(("))
console.log(validParentheses("()()()()()()"))
console.log(validParentheses("((()))"))
console.log(validParentheses("((())))"))
fkaflof6

fkaflof64#

stack[index-1] === cur中,比较字符是否与存储在堆栈中的字符不同,所以)(相反的括号将有效
你可以试着这样做

function validParentheses(parens) {
    if (parens % 2 == 1) return false;
    for (let i = 0; i < parens.length; i++) {
        const char = parens[i];
        if (char == "(") {
            if (parens[i + 1] == ")") {

                i++;
            } else {
                return false
            }
        } else {
            return false
        }
    }
    return true;
}
wztqucjr

wztqucjr5#

您还需要检查最后添加的值,因为未解析的右括号应该保留在堆栈中。
顺便说一句,Array#forEach是选择的方法,因为Array#map返回一个新的数组,这里没有使用。

function validParentheses(parens) {
    var stack = [];

    parens.split('').forEach((cur, index) => {
        if (cur === ')' && stack[stack.length - 1] === '(') stack.pop();
        else stack.push(cur);
    });

    return !stack.length;
}

console.log(validParentheses("(())()"));
console.log(validParentheses("()()()()()(("));
console.log(validParentheses("))(())"));

相关问题