力扣:20-有效的括号

题目详解

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
 

示例 1:

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


示例 2:

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


示例 3:

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

提示:

1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成

来源:力扣(LeetCode)

解题思路

这道题的思路就是运用栈的原理,栈是先进后出,运用这个原理之后就容易的解出这道题。这道题需要注意的是什么是有效字符。首先每个右括号都要有相同类型的左括号与之匹配,也就是如果所给字符串的长度为奇数的话是不满足这个的,所以一定不是有效字符,返回false。其次是左括号必须以正确的顺序闭合,比如'([])'这个就是正确的顺序,而'([)]'这样就是不正确的顺序。要先闭合[才能闭合(。

代码实现 

class Solution {
public:
    bool isValid(string s) {
        //如果是奇数,一定不是有效字符串
        if(s.size()%2==1)
        return false;
        stackst;//栈
        //遍历字符串
        for(auto ch:s)
        {
            //如果当前字符是左括号,就入栈
            if(ch=='('||ch=='['||ch=='{')
            {
                st.push(ch);
            }
            //如果是右括号,判断栈是否为空以及栈顶是否是对应的左括号
            else
            {
                if(st.empty())
                return false;
                switch(ch){
                case ')':
                    if(st.top()!='(')
                    return false;
                    break;
                case ']':
                    if(st.top()!='[')
                    return false;
                    break;
                case '}':
                    if(st.top()!='{')
                    return false;
                    break;
                }
                //如果有对应的括号,则栈顶出栈
                st.pop();
            }
        }
        return st.empty();
    }
};

这样写有一点不太简洁,后面看了题解,发现可以哈希表优化,下面是哈希表优化后的版本

class Solution {
public:
    bool isValid(string s) {
        //如果是奇数,一定不是有效字符串
        if(s.size()%2==1)
        return false;
        stackst;//栈
        //创建一个哈希表,先把所有类型的括号加进去
        unordered_mapud=
        {
            {')','('},{'}','{'},{']','['}
        };
        //遍历字符串
        for(auto ch:s)
        {
            //如果是左括号,进栈
            if(ud.count(ch)==0)
            {
                st.push(ch);
            }
            //如果是右括号,判断栈是否为空以及栈顶是否是对应类型的左括号
            else
            {
                if(st.empty())
                return false;
                if(st.top()!=ud[ch])
                return false;
                st.pop();
            }
        }
        return st.empty();
    }
};

你可能感兴趣的:(力扣算法题,leetcode,算法,java)