「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」
问题描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
需要满足以下要求:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合
示例:
输入:s = "()"
输出:true
输入:s = "()[]{}"
输出:true
输入:s = "(]"
输出:false
输入:s = "([)]"
输出:false
输入:s = "{[]}"
输出:true
解题过程
function brackets( symbol ) {
let obj = {
'(':')',
'{':'}',
'[':']'
};
let newArr = [];
for(let i=0; i<symbol.length; i++) {
if(obj[symbol[i]]) {
newArr.push(symbol[i]);
} else {
let last = newArr[newArr.length - 1];
if(obj[last] === symbol[i]) {
newArr.pop();
}else{
return false;
}
}
}
return newArr.length===0;
}
console.log(brackets('([]){'))
从题目我们可以知道,字符串是由'(',')','{','}','[',']'这里的一个或者多个拼接而成的,所以,我们可以先利用这些括号声明一个对象obj,括号的左边作为键、括号的右边作为值这样一一对应起来;
声明一个变量newArr存放括号;
循环传进来的字符串,方便取到所有括号;判断循环到的半边括号是不是对象obj的键,若是键的话那就证明是括号的左边,并且能取出值,然后可以把它push到数组newArr进去;
若不是对象的obj的键,那就证明是括号的右半边部分,那就取出数组的最后一个元素(这个元素就是括号的左半边部分),再根据这个元素从对象obj找出对应右边的部分,再和这次循环到的元素(知道是括号的右半边部分)一起对比,若是相同,则证明数组最后一个元素和这次循环到的元素是一对括号,可以把最后一个元素从数组中删除;若是不相同,则可以 return false 出去。
或者,循环遍历完之后,都没又出现不同的,括号之间也两两配对成功,newArr里面的元素也被清空了,长度为0了,则可以 return true 出去。