leetcode-20 有效的括号

题目

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

有效字符串需满足:

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

测试用例

示例 1:

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

示例 2:

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

示例 3:

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

第一次提交:

class Solution {
public:
    bool isValid(string s) 
    {
        stack<char> st;
        int len=s.length();
        for(int i=0;i<len;i++)
        {
            if(!st.empty())
            {
                if(st.top()=='(' && s[i]==')')
                    st.pop();
                else if(st.top()=='['&&s[i]==']')
                    st.pop();
                else if(st.top()=='{'&&s[i]=='}')
                    st.pop();
            }
            
            st.push(s[i]);
               
        }
        if(st.empty())
            return true;
        else
            return false;

    }
};

算法思路:

最每个字符串都进行遍历,只有当栈的最顶端是左括号,当前遍历的字符是右括号,而且正好是一对时,出栈,剩下其他的情况都入栈,如果最后一个字符也遍历完,但是栈不为空,证明有括号没有被匹配,则字符串无效,反之栈空,则有效。

修改:

修改1:

关于continue,和break

continue:只是跳出当前 i 的循环,continue后紧接着进行 i+1的循环

break:彻底跳出循环,之后的 i 都不运行了

修改2:

如上的代码是不对的,以第一个示例为例,遇到第一个字符,左括号,push进去,遇到第二个字符,右括号时,栈内出栈,但同时这个字符也被push进去了,栈内就只留下了一个右括号,最后结果栈不为空,不是有效的括号,判断错误。

关键是有既弹栈又入栈的操作,遍历每一个字符,弹栈还是入栈只能进行一个。

修改3:最后根据栈空输出true和false的方法可以简化,因为st.empty()的值就是true或者false,可以直接使用。

修改后的提交:

class Solution {
public:
    bool isValid(string s) 
    {
        stack<char> st;
        int len=s.length();
        for(int i=0;i<len;i++)
        {
            if(!st.empty())
            {
                if(st.top()=='(' && s[i]==')')
                {
                    st.pop();
                    continue;
                }
                    
                else if(st.top()=='['&&s[i]==']')
                {
                    st.pop();
                    continue;
                }
                    
                else if(st.top()=='{'&&s[i]=='}')
                {
                    st.pop();
                    continue;
                }
                    
            }
            
            st.push(s[i]);
               
        }
        return st.empty();

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值