有一个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
...(?)
答案 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) }
}