[LeetCode] 20_有效的括号

[LeetCode] 20_有效的括号

题目要求

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true

题目分析

  1. 建立一个栈,当输入’(’, ‘[’, '{'时,将字符存入栈中
  2. 当输入’)’, ‘]’, '}'时,如果栈为空,则失败;如果栈不为空,当栈顶与字符不匹配时,失败,否则将从栈中退出一个字符(即退出匹配的字符)
  3. 当整个字符串都遍历完时,若栈不为空则失败,否则成功

注意点

要学会合理而全面地分析情况,抓住本质,不要拘泥于细枝末节。一开始我是选择讨论各种情况,导致代码很繁琐,而且总有疏漏。
这道题很重要的一部分在于消除,当括号能够匹配时就可以进行消除,如果消除不完或者匹配错误就返回false。
但是如果在字符串中进行消除的话,就要面临有些字符为空的问题,那么就使用一个额外的栈进行辅助。在栈中,消除仅意味着退栈。

代码

class Solution {
public:
    bool isValid(string s) {
        stack<char>Stack;
        for(int i=0;i<s.length();++i){
            if(s[i]==')'){
                if(Stack.empty() || Stack.top()!='(')return false;
                Stack.pop();
            }
            else if(s[i]==']'){
                if(Stack.empty() || Stack.top()!='[')return false;
                Stack.pop();
            }
            else if(s[i]=='}'){
                if(Stack.empty() || Stack.top()!='{')return false;
                Stack.pop();
            }
            else{
                Stack.push(s[i]);
            }
        }
        return Stack.empty();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值