题目
Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
An input string is valid if:
- Open brackets must be closed by the same type of brackets.
- 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();
}
};