[英]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解決方案很容易理解並且通過了所有測試。 然而我知道它的優化不是一流的。 它只是一步一步地消除元素:
開始: ({[]})|| ( { [] } }
然后: ({})|| ( {} }
然后: () || (} Finish:清除 || 剩菜
當 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.