算法:栈-- LC20 有效的括号

算法:栈-- LC20 有效的括号

题目描述

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/2021-spring-recruitment/9ht621/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目分析

通过题目描述可以看出,最能体现括号特点的是括号嵌套的时候。在多个括号嵌套的时候最后进去的左括号要最先由右括号闭合。因为有这种最后进入的要最先出来的特点,要使用“栈”结构作为主结构。

括号应该如何推入栈中?因为正常情况下总是’(‘先出现,因此将’('当作入栈的元素。

从栈中pop出来时应该如何与’)'匹配?用hashmap或function将左括号与右括号做匹配。

解决

目前此题目的数据结构决定为 stack 和 hashmap,主要流程为

bool isValid(string s) 
{
    stack<char> stk;
    /*
    hashmap 为左括号和右括号做配对
    */
    unordered_map<char> leftRMap;
    leftRMap['('] = ')';
    leftRMap['{'] = '}';
    leftRMap['['] = ']';
    /*遍历整个字符串*/
    for(int index=0; index < s.size();index++)
    {
        char curChar = s[index];
        /*
        如果当前为左括号
        */
        if(curChar == '(' || curChar == '[' || curChar == '{')
        {            
            /*将左括号匹配的右括号push到stack里*/
            stk.push(leftRMap[curChar]);
        }
        else
        {
            /*遇到右括号时pop出最上面的内容,并于右括号匹配。因为之前push的内容都已转化为右括号,因此直接匹配是否一致就可*/
            if(stk.empty() || stk.top() != curChar)
            {
                return false;
            }
            stk.pop();
        }
    }
}

需要注意

边界条件

有2种cases需要特别地解决:

  1. 当string全是“(” or “)” 多出时的处理
    当string全是 “((” 时,因为没有 “)” 所以stack里的值删除不了,因此在string都遍历完毕后 stack里有值的一定是 “(” 多出来了。
return stk.empty();

当string中 “)” 多出来时,stack里面一定是空的()

if(charStack.empty() || charStack.top() != s[i])

上述代码的charStack.empty()解决了这个问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值