有效括号-CodeWars挑战-JavaScript

时间:2019-05-20 01:59:54

标签: javascript string curly-braces braces

有一个challenge on codewars,要求您检查一串括号,方括号和花括号是否有效。

  

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

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

"(){}[]"有效,而"[({})](]"无效。等等

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

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 ...(?)

进行检查

5 个答案:

答案 0 :(得分:2)

您可以使用array来跟踪先前出现的开括号,一旦出现任何结束标记,则需要将其与数组的最后一个值进行匹配(如果匹配),则将最后一个值弹出,否则返回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

答案 1 :(得分:1)

您实际上并不需要在这里使用数组,只需使用正则表达式和递归即可:

const regex = /\(\)|\[\]|\{\}/;
const validBraces = braces => regex.test(braces)
  ? validBraces(braces.replace(regex, ''))
  : '' === braces

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('{}}')) // false
console.log(validBraces('{({}}')) // false
console.log(validBraces('((}}')) // false
console.log(validBraces('}[)}')) // false

答案 2 :(得分:1)

function validBraces(braces){
 while(/\(\)|\[\]|\{\}/g.test(braces)){braces = braces.replace(/\(\)|\[\]|\{\}/g,"")}
 return !braces.length;
}

// double regex 

答案 3 :(得分:0)

希望我的代码可以为您提供帮助

    function validBraces( braces ) {
        braces = braces.split( "" );
        var string = ["(","[","{","}","]",")"];

        if( braces.length % 2 == 0 ) {
            for( let i = 0; i < ( string.length / 2 ); i++ ) {
                if( braces.indexOf( string[i] ) != -1) {
                    for( let a = 0; a < braces.length; a++ ){
                        if( braces[a] == string[ ( string.length - 1 ) - i ] &&  ( a + braces.indexOf( string[i]) ) % 2 != 0 ) {
                            while( string[ ( string.length - 1 ) - i ] != -1 && braces.indexOf( string[i]) != -1 &&  a > braces.indexOf( string[i] ) ) {
                                braces.splice( braces.indexOf( string[i]), 1 );
                                braces.splice( braces.indexOf( string[ ( string.length - 1 ) - i ] ), 1 );
                            }
                        }
                    }
                }
                if( braces.length == 0 ) {
                    return true
                }
            }
        }

        return false
    }

答案 4 :(得分:0)

在scala中,您可以这样做

object Kata {

  def validBraces(s: String): Boolean =
    s.replace("()", "").replace("[]", "").replace("{}", "") match { case "" => true; case `s` => false; case x => validBraces(x) }
}