簡體   English   中英

有效括號 - CodeWars 挑戰

[英]Valid Braces - CodeWars Challenge

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進行檢查......(?)

編輯:理解這一挑戰的關鍵是右大括號必須直接位於左大括號之后,或者它必須“平行” - 與另一個對稱。

你真的不需要在這里使用數組,你可以只使用正則表達式和遞歸:

 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

您可以使用array來跟蹤以前出現的左大括號,一旦出現任何結束標記,您需要將它與數組的最后一個值匹配,如果它匹配彈出最后一個值 else 返回 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

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

在 Scala 你可以做到這一點

object Kata {

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

我已經在 Scala 中完成了一些測試並且它有效。 如果字符串的長度是 2 如果不需要輸入遞歸調用因為在匹配中你已經檢查了它是否正確:

   object Kata1{
        def validBraces(s: String): Boolean ={
          var valid: Boolean = true
          if(s.length > 1){
           s(0) match{
              case '('  => if( s(1) == ')' || s(s.length-1) == ')'){
                if(s.length != 2){
                  if(s(1) == ')'){
                    valid = validBraces(s.substring(2, s.length))
                  }else{
                    valid = validBraces(s.substring(1, s.length-1))
                  }
                }
          } else {
                if(s.lastIndexOf(')') != -1){
                 var newS = s.substring(0, s.indexOf(')')).concat(s.substring(s.indexOf(')')+1, s.length))
                  valid = validBraces(newS.substring(1, s.length-1))
                }else valid = false
           }
        case '['  => if( s(1) == ']' || s(s.length-1) == ']') {
         if(s.length != 2){
          if(s(1) == ']'){
           valid = validBraces(s.substring(2, s.length))
         }else{
           valid = validBraces(s.substring(1, s.length-1))
         }
       }
      } else {
       if(s.lastIndexOf(']') != -1){
         var newS = s.substring(0, s.indexOf(']')).concat(s.substring(s.indexOf(']')+1, s.length))
        valid = validBraces(newS.substring(1, s.length-1))
      }else valid = false
    }
    case '{'  => if( s(1) == '}' || s(s.length-1) == '}') {
      if(s.length != 2){
        if(s(1) == '}'){
          valid = validBraces(s.substring(2, s.length))
        }else{
          valid = validBraces(s.substring(1, s.length-1))
        }
      }
    } else {
      if(s.lastIndexOf('}') != -1){
        var newS = s.substring(0, s.indexOf('}')).concat(s.substring(s.indexOf('}')+1, s.length))
        valid = validBraces(newS.substring(1, s.length-1))
      }else valid = false
    }
    case _ => valid = false
  }
  /*if(s.length != 2 && valid){
    if(s(1) == ')'  || s(1) == '}'  || s(1) == ']' ){
      valid = validBraces(s.substring(2, s.length))
    }else{
      valid = validBraces(s.substring(1, s.length-1))
    }
  }*/
}else{
  valid = false
}

if(s.length == 0){
  valid = true
}
valid
 }
 }

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

我的這個kata的JavaScript解決方案很容易理解並且通過了所有測試。 然而我知道它的優化不是一流的。 它只是一步一步地消除元素:

  1. 開始: ({[]})|| ( { [] } }

  2. 然后: ({})|| ( {} }

  3. 然后: () || (} Finish:清除 || 剩菜

  4. 當 length = 0 時它通過,當 length > 0 時它不會

 function validBraces(braces){ while(braces.indexOf("{}").== -1 || braces.indexOf("()").== -1 || braces,indexOf("[]").== -1){ braces = braces,replace("{}". ""),replace("()"; "").replace("[]"? ""): } return braces;length === 0. true; false; console.log(validBraces("(({{[[]]}}))"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM