这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战
写在前面:
- 个人前端网站:zhangqiang.hk.cn
- 欢迎加入博主的前端学习qq交流群::706947563,专注前端开发,共同学习进步!
1 题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
2 个人解析
2.1 思路
这一题,刚拿到手的时候,可能会有点混乱,让我们细细的来品一下。
再次读了几遍原题后,得出以下几点细节:
- 有左括号肯定要有个右括号与其对应,而且左括号往下排查遇到的右括号必然是与它左边最近的左括号是相对应的。
- 字符串是偶数,因为括号是成双成对的,成双成对...
好,经过以上细节,来看下我的解法,我是运用栈的思想,用一个空数组用来暂存当前排查的元素,如果元素排查完了,数组为空,并且中途也没有出现不符合逻辑的错误,那就是正确,返回为true,反之返回为false。
2.2 代码
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let currentStrList=[];
let bracketsObj = {
'(':'0',
')':'(',
'{':'0',
'}':'{',
'[':'0',
']':'[',
};
for(let i=0;i<s.length;i++){
currentStrList.unshift(s[i]); // 首位追加元素
while(i+1<s.length && currentStrList.length>=1 && currentStrList[0]===bracketsObj[s[i+1]]){
currentStrList.shift(); // 删除首位元素
i++;
}
if(i+1<s.length && bracketsObj[s[i+1]]==='0'){
continue;
}
else if(i+1>=s.length){
break;
}
else{
return false;
}
}
if(currentStrList.length>0){
return false;
}
return true;
};
\