Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入: s = "()"
输出: true
示例 2:
输入: s = "()[]{}"
输出: true
示例 3:
输入: s = "(]"
输出: false
示例 4:
输入: s = "([)]"
输出: false
示例 5:
输入: s = "{[]}"
输出: true
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
题目解释
这题比较简单,但容易出错
之前想法比较简单,遍历每个字符,找到左括号,就用indexof 查找右括号,截取字符串,当字符串为'' ,就代表字符串是合法的。但是忽略掉一种情况
(}{)
如上所示,当检测到'(',我会查找')',截取掉字符串会把'}{'忽略掉。
错误的代码如下:
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let len = s.length;
if( len % 2 != 0){
return false;
}
let obj = {
"{":"}",
"(":")",
"[":"]",
}
for(var i in obj){
//key 出现的第一个位置
let keyNum = s.indexOf(i);
//value 出现的第一个位置
let valueNum = s.indexOf(obj[i]);
if(keyNum > -1 && valueNum > -1){
//左右括号对调
if(keyNum > valueNum){
return false;
}
//存在key 查找value出现的第一个位置
s = s.substring(valueNum+1);
if(!s){
return true;
}
}else{
return false;
}
}
return true;
};
查阅了官方的解题思路,我觉得用栈可能会更好点。
解法1 栈
- 设置一个队列
stk存储 括号 - 判断当前括号的括号 是左括号还是右括号
- 左括号直接存进队列
stk里 - 右括号 根据map 的key 找出value,对比下跟
stk最后一个值是否一样 - 一样就把
stk最后一个值删掉,进入下一个循环 - 不一样,说明这个不是合法的。
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let len = s.length;
if( len % 2 != 0){
return false;
}
let map = new Map([
[')', '('],
[']', '['],
['}', '{']
]);
let stk = []
for(var i of s){
if(map.has(i)){
//当字符串是右括号,可以查找左括号 并删除
if(stk && stk.slice(-1)[0] === map.get(i)){
//删除stk最后一个值
stk.pop();
}else{
return false
}
}else{
//左括号 进队列
stk.push(i);
}
}
return stk.length==0;
};