「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」
前言
每天至少一道算法题,死磕算法
链表的题目咱们告一段落,今天我们开始栈和队列题目
栈和队列的数据结构想必大家都有所了解,在这里我就不抖书包了,直接来个题让大家感受一下
题目
这是leetcode上的第20道题目20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入: s = "()[]{}"
输出: true
思路
第一步:从题目中提取关键词
- 1.左括号必须用相同类型的右括号闭合。这句话的意思就是要对称
- 2.左括号必须以正确的顺序闭合。这句话是精髓呀,什么是正确的顺序闭合,就是左括号出现的顺序必须和闭合的顺序是对称的,比如
[()]是正确的顺序,([)]这种闭合顺序不对称,就不是正确的顺序闭合,这不正符合栈数据结构的后进先出的特征么,这都明确的提醒你了,要用栈来解题,就差扯着嗓子和你喊了
第二步:技巧
1.解答对称性的这类题目,我们应该首先想到栈,根据栈的后进先出原则,一组数据的入栈和出栈顺序刚好是对称的。
2.括号类的问题,我们都可以往栈上想
第三步:分析 1.第一步先考虑特殊情况问题,有没有可能为空呀,是有可能为空的 2.题中给的有效括号,我们要保存起来,要不没法识别,因为是对称的,所以我们用object保存
let object = {
"(":")",
"[":"]",
"{":"}",
};
3.我们模拟一个栈结构,
- 如果是object的key,那么入栈key的value值
- 如果不是object的key
- 如果栈顶和元素匹配,那么出栈
- 如果栈顶和元素不匹配,那么直接返回false 4.循环结束以后,如果stack没有值,那么返回true,如果有值,那么返回false
题解
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
// 首先保存起来要用的括号
let object = {
"(":")",
"[":"]",
"{":"}",
};
// 模拟栈结构
let stack=[];
for(let i=0;i<s.length;i++){
let cur = s[i];
//如果是object的key,那么入栈key的value值
if(object[cur]){
stack.push(object[cur]);
//如果栈顶和元素匹配,那么出栈
}else if(stack[stack.length-1]===s[i]){
stack.pop();
}else{
// 如果栈顶和元素不匹配,那么直接返回false
return false;
}
}
// 遍历结束以后,看stack是否为空,有值返回false,无值返回true
return !stack.length;
};
看一下执行的时间还不错
总结
玩转栈的算法题,一定要先了解栈的数据结构,栈的数据结构就像冰箱一样,元素就是雪糕,我们后放进去的雪糕,先拿出来,先放进去的后拿出来。大家要多发挥自己的想象力,把未知的知识,去和已知的知识建立联想