题目描述:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
方法1:利用栈
主要思路:
(1)利用栈的先进后出的特性,将左括号直接压入到栈中,遇到右括号,若栈为空,则返回false,若栈不为空,则看栈中的顶部元素是否为对应的左括号,若是,则弹出顶部元素,若不是,则返回false;
(2)最后返回栈的状态,若栈不为空,则说明没有匹配完全,返回false,若为空,则说明匹配完全,返回true;
class Solution {
public:
bool isValid(string s) {
//处理特殊的情形
if(s.empty())
return true;
if(s.size()&1)//若为奇数,则肯定不能匹配,直接返回false
return false;
stack<char> st;
for(char &ch:s){
if(ch=='('||ch=='{'||ch=='['){//左括号,直接压入到栈中
st.push(ch);
}
else {
//右括号,若栈为空,则说明没有匹配的左括号,返回false
if(st.empty()){
return false;
}
//若顶部的括号和现在的右括号匹配,则弹出顶部的括号
else if((st.top()=='('&&ch==')')||(st.top()=='['&&ch==']')||(st.top()=='{'&&ch=='}')){
st.pop();
}
else {
return false;//否则返回false
}
}
}
return st.empty();//返回栈的状态
}
};