我正在尝试使用正则表达式解决任务。给定一个带有字符串参数的函数。该字符串包含(){}<>[]
大括号。我必须检查字符串在语法上是否正确,并且还应该对大括号嵌套进行计数。
这是我的版本(不完整)`
const checkBraces = (str) => {
const newStr = str.replace(/[^(){}<>[\]]+/gi, '');
let answer = newStr.match(/\(+\)+|\<+\>+|\{+\}+|\[+\]+/g);
console.log(answer);
}
这是功能`
的最少测试次数checkBraces("---(++++)----") == 0
checkBraces("") == 0
checkBraces("before ( middle []) after ") == 0
checkBraces(") (") == 1
checkBraces("} {") == 1
checkBraces("<( >)") == 1
checkBraces("( [ <> () ] <> )") == 0
checkBraces(" ( [)") == 1
如果存在en错误,则该函数应返回1,否则返回0。
在我的函数中,我首先尝试替换所有non-braces
,所以我有一个清晰的字符串。现在我无法解决这个问题。
答案 0 :(得分:6)
您可以通过遍历字符串并保留一堆开括号来解决此问题。每次找到右括号,请从堆栈中弹出。右括号应与您弹出的内容匹配,否则它们将不平衡。最后,堆栈应为空:
let braces = { // lookup to match closing with opening
'(':')',
'{':'}',
'<':'>',
'[':']'
}
let closing = new Set([')', '}', '>', ']']) // quick lookup of brackets
let opening = new Set(['(', '{', '<', '['])
function checkBraces(str) {
/* returns true if balanced, false if unbalanced */
let stack = []
for (l of str){
if (closing.has(l)){ // found a closing bracket
if (l !== braces[stack.pop()]) return false // does it match the last opening?
} else if(opening.has(l)) stack.push(l) // found an opening push to the stack
}
return stack.length === 0
}
console.log(checkBraces("before ( middle []) after "))
console.log(checkBraces("<( >)"))
console.log(checkBraces("( [ <> () ] <> )"))
console.log(checkBraces(" ( [)"))
console.log(checkBraces(" )"))
console.log(checkBraces(" <"))
答案 1 :(得分:0)
除了push
和pop
之外,不使用任何内置函数。
function check(s) {
var arr = [];
for (let i = 0; i < s.length; i++) {
if (s[i] === '{' || s[i] === '[' || s[i] === '(' || s[i] === '<' ) {
arr.push(s[i]);
} else if (s[i] === '}' || s[i] === ']' || s[i] === ')' || s[i] === '>' ) {
if ( arr[arr.length-1] === s[i] ) {
arr.pop();
} else {
return 'not balanced';
}
}
}
if(arr.length) return 'not balanced';
return 'balanced';
}
console.log(check('{781234}[3,4,5,6 ]< >( sdfhniusdf )'));
console.log(check('asssssssssss {}');
console.log(check(' as< habsdj');