Leetcode Valid Parentheses思路

题目

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.

Note that an empty string is also considered valid.

Example 1:

Input: "()"
Output: true

 Example 2:

Input: "()[]{}"
Output: true

Example 3:

Input: "(]"
Output: false

Example 4:

Input: "([)]"
Output: false

思路

这道题目虽然是easy难度的,但是解题思路还是挺有意思的,题目意思就是匹配括号,输入一个左括号'(',然后再输入一个右括号')',如果和前面的左括号匹配上了,那就输出true,如果还有括号没有匹配上的,那么就输出false,当然如果一开始就输入一个右括号,那么这个输出结果就一定是false了,因为无论如何结果都会剩下一个第一个右括号没法匹配上。

代码实现上主要用了栈这种数据结构,大家应该都还记得栈的一些基本操作,还有以前做过的一些习题,用栈去做加减法的运算,把相应的数字和运算符压入栈中,碰到运算符pop出两个操作数,然后进行运算,再将运算结果压入栈中,最后计算出结果,其实这道题就是可以按照这个思路来做。

先从头开始遍历字符串,判断是否是左括号,如果是左括号,那么就push到栈中,再向后遍历字符串,判断是否是右括号,如果是,再从栈中取出刚刚push的左括号,进行匹配,匹配上了那么就pop出刚刚push的左括号,依次类推,直到匹配不上了,就返回false,当然这里还要考虑几种特殊情况,比如一开始就是一个右括号,这首先要判断栈是否是空的,如果是空的就直接返回false,还有字符串是空的这种情况等。

代码实现

class Solution {
public:
    bool isValid(string s) {
        if(s.size()==0) return true;
        stack<char> stackStr;
        for(int i=0,len=s.length();i<len;i++)
        {
            if(s[i]=='['||s[i]=='{'||s[i]=='(')
            {
                stackStr.push(s[i]);
            }
            else if(!stackStr.empty())//如果是右括号首先判断栈是否是空的
            {
                if(s[i]==')'&&stackStr.top()=='(')
                {
                    stackStr.pop();
                }
                else if(s[i]=='}'&&stackStr.top()=='{')
                {
                    stackStr.pop();
                }
                else if(s[i]==']'&&stackStr.top()=='[')
                {
                    stackStr.pop();
                }
                else//匹配不上直接返回false
                {
                    return false;
                }
            }
            else//栈是空的直接返回false
            {
                return false;
            }
        }
           return stackStr.empty(); 
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值