温馨提示:本文翻译自stackoverflow.com,查看原文请点击:javascript - Valid Braces
javascript string curly-braces braces

javascript - 有效括号

发布于 2020-03-31 23:10:20

代码战有一个挑战,要求您检查括号,方括号和花括号的字符串是否有效。

如果所有括号都与正确的括号匹配,则一串括号被视为有效。

"()"有效,"[(])"无效。

"(){}[]"是有效的,"[({})](]"不是。等等。

我已经能够创建一些逻辑来检查是否有正确数量的开合括号。

尝试

function validBraces(braces) {

  let parenCount = 0;
  let squareBracketCount = 0;
  let curlyBraceCount = 0;

    for (let i =0; i < braces.length; i++) {
      let character = braces[i];
        if (character === "(") {
          parenCount -= 1;
          }
        if (character === ")") {
          parenCount += 1;
          }
        if (character === "[") {
          squareBracketCount -= 1;
          }
        if (character === "]") {
          squareBracketCount += 1;
        }
        if (character === "{") {
          curlyBraceCount -= 1;
        }
        if (character === "}") {
          curlyBraceCount += 1;
        }
      }
      if (parenCount === 0 && squareBracketCount === 0 && curlyBraceCount === 0) {
        return true;
      } 
      else {
        return false;
      }
}

但是我还没有想出一种方法来检查下一种撑杆打开之前撑杆是否“闭合”

也许是这样的吗?

if (
  (firstChar === "(" && lastChar === ")") ||
  (firstChar === "{" && lastChar === "}") ||
  (firstChar === "[" && lastChar === "]")
) {
  return true;
} else {
  return false;
}

但这必须根据我的其他if-statement...(?)进行检查。

编辑:理解此挑战的关键是闭合支架必须直接在开口支架之后,或者必须是“平行”的-彼此对称。

查看更多

提问者
HappyHands31
被浏览
17
Code Maniac 2019-05-31 10:07

您可以array用来跟踪先前出现的开括号,一旦出现任何结束标记,则需要将其与数组的最后一个值匹配(如果匹配),将最后一个值弹出,否则返回false,最后返回false空数组返回true,否则返回false

function validBraces(braces){
  let tracer = []
  for(let i=0;i < braces.length; i++){
    if ( braces[i] === "(" || braces[i] === "{" || braces[i] === "["){
      tracer.push(braces[i])
    } else{
      if(tracer.length === 0) return false
      let lastValue = tracer[tracer.length-1]
      if( (braces[i] === ']' && lastValue === '[') || (braces[i] === '}' && lastValue === '{') || (braces[i] === ')' && lastValue === '('))
      {
        tracer.pop()
      } else {
        break;
      }
    }
  }
  return tracer.length === 0
}


console.log(validBraces( "()" )) // true
console.log(validBraces( "[]" )) // true
console.log(validBraces( "{}" )) // true
console.log(validBraces( "(){}[]" )) // true
console.log(validBraces( "([{}])" )) // true
console.log(validBraces( "(}" )) // false
console.log(validBraces( "[(])" )) // false
console.log(validBraces( "({})[({})]" )) // true
console.log(validBraces( "(})" )) // false
console.log(validBraces( "(({{[[]]}}))" )) //true
console.log(validBraces( "{}({})[]" )) // true
console.log(validBraces( ")(}{][" )) // false
console.log(validBraces( "())({}}{()][][" )) // false
console.log(validBraces( "(((({{" ))  // false
console.log(validBraces( "}}]]))}])" )) // false