Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
leetcode第20题:有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()[{}]"
输出:true
示例 2:
输入:s = "{(]}"
输出:false
二、思路分析:
栈结构的特点:先入后出,后入先出。(可以视为一个有底的桶)
- 这个典型的利用栈的思想来做。
- 以示例1来说:我们对字符串进行遍历:①第一个字符为
(
左括号,我们入栈。②下一个为)
右括号,就将栈中的左括号出栈,目前栈为空。③第3个字符为[
也是左括号,入栈。④第4个为{
也入栈,目前栈中为:[{
。⑤第5个为}
,可以匹配上栈顶的{
,{
出栈。⑥第6个为]
,匹配到最新的栈顶[
,[
符号出栈。⑦检测栈目前为空,没有多余的符号,return true。 - 以示例2来看:①第一个字符为
{
左括号,我们入栈。②下一个为(
左括号,也入栈,目前栈为{(
。③第3个字符为]
为右括号,右括号需要在栈中寻找对应的左括号匹配,发现栈顶的括号并不匹配,说明错误,直接return fasle
三、AC 代码:
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const stack = []
const obj = { '(': ')', '{': '}', '[': ']' }
for (let i=0;i<s.length; i++) {
const item = s[i]
if (item in obj) {
// item是obj的key:说明是左括号,入栈
stack.push(item)
} else {
// 否则为右括号,判断是否跟栈顶匹配
// 栈顶即数组的最后一位,不匹配的话则直接返回false,不用后面的循环
if (item!==obj[stack.pop()]) {
return false
}
// 匹配的话则不进行任何操作了,上面判断时已进行了出栈操作。直接下一轮循环即可
}
}
return !stack.length;
};
四、总结:
本题可扩展为各种成对的符号的判断,另外还有类似栈结构相关题目的有: