【LeetCode刷题-简单】20. 有效的括号

题目

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

有效字符串需满足:

 

  1.     左括号必须用相同类型的右括号闭合。
  2.     左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true


示例 2:

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


示例 3:

输入: "(]"
输出: false


示例 4:

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


示例 5:

输入: "{[]}"
输出: true

 

思路

关于这道题的思路,邓俊辉讲的非常好 视频地址

使用栈,遍历输入字符串

如果当前字符为左半边括号时,则将其压入栈中

如果遇到右半边括号时,分类讨论:

1)如栈不为空且为对应的左半边括号,则取出栈顶元素,继续循环

2)若此时栈为空,则直接返回false

3)若不为对应的左半边括号,反之返回false

 

 

 

 

Python

技巧:若栈为空,匹配 ')' or ']' or '}',直接返回false

class Solution:

    def isValid(self, s: str) -> bool:

        val = []

        val_map = {'(':')', '[':']', '{':'}'}

        for i in s:

            if len(val) == 0 and (i == ')' or i == ']' or i =='}'):

                return False

            if i in val_map:

                val.append(val_map[i])

            else:

                if len(val) != 0:

                    top_val = val.pop()

                    if top_val != i:

                        return False

                    else:

                        continue

                else:

                    return False

        return len(val) == 0

 

C++

技巧2:判断左右括号是否匹配,从ASCII码表中,()相差1,[]与{}都是相差2的,所以当右边的括号减去左边的括号为1或者2的时候,说明括号匹配了。

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        for(int i=0;i<s.size();i++)
        {
            if(st.empty()&&(s[i]==')'||s[i]=='}'||s[i]==']'))
               return false;    //栈空,遇到右边的括号,直接返回false
            if(s[i]==')'||s[i]=='}'||s[i]==']')  //遇到右边的括号,判断栈顶是否
               {                                 //是对应的左边的括号。
                   if(s[i]-st.top()==1||s[i]-st.top()==2)
                       st.pop();   //对应的话,栈顶元素退栈。
                   else
                       return false;  //不对应的话,直接返回false。
               }
            else
               st.push(s[i]);   //遇到左边的括号,进栈。
        }
        return st.empty();  //栈空,说明括号都匹配了。
    }
};

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值