题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses
解题思路:
用js 中的标准内置对象,Map(),使用map.set()把'{}' '[]' '()' 以键值对的形式,放入map中,
对于字符串s的每一个字符(这些字符只能是{} [] () 组成),都要配对上他的另外一边,通过观察,
我们不难发现要想以正确的形式配对成功,我们应该用 stack (也就是我们常说的栈,他是一个遵循 ”先进后出“ 原则的容器 ) ,若对于s 中的字符,是map 的键,就把值推入栈中;若不是map的键,(题目中有描述,s 仅由 ‘(){} [ ]’ 组成),则从 栈中弹出一个(也就相当于是数组最后一个元素),进行 比较。(后面的就比较简单了,大家自行看代码理解,同时,我有什么写得不对的地方,也欢迎大家在评论区留言)
步骤:
- 创建一个map, 把使用map.set()把'{}' '[]' '()' 以键值对的形式,放入map中
- 创建栈,用for 循环遍历字符串 s, 比较每一个字符,属于键的,把他的对应的值,也就是配对的右边,推入栈中, arr.push(a), 不属于键,则将其与栈中的最后一个元素比较,相等,则arr.pop() 推出栈,不相等 return false ; 匹配失败。
- 循环结束,我们还要考虑一种情况,s = '[ {} ] (' 这种奇数个的,也是匹配失败的。 if 判断栈是否为空,不为空,则 return false.
代码:
var isValid = function(s) {
const map1 = new Map();
map1.set('{','}');
map1.set('[',']');
map1.set('(',')');
let stack = [];
//字符串的循环
for (const item of s) {
if(map1.has(item)){
stack.push(map1.get(item));
//这一步把匹配的值推入这个栈中
}else{
//与最后一个比的原因是,栈的先进后出,同时,括号匹配,也是匹配右括号匹配没有配对成功的离自己最近的左括号
if(item === stack[stack.length-1]){
stack.pop();
//第一个出栈
}else{
return false;
}
}
}
//对栈判空,数组长度大于0 ,代表栈不为空
if(stack.length > 0){
return false;
}
return true;
};
最后:
求赞,求关,永远爱你哦!!!