地址:20. 有效的括号
题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例
输入:s = "()[]{}" 输出:true输入:s = "(]" 输出:false
思路
采用辅助栈的方法
- 左括号入栈则在遇到右括号时相应栈顶的左括号出栈,若遍历结束后栈为空,则返回true
- 利用哈希表构建左右括号映射key-value关系
写法
- 若为左括号,push入栈
- 用哈希表判断对应关系,如果栈顶stack.pop()与当前遍历到的括号无法匹配,则直接返回false
关于边界处理问题
-
若最后栈为空了,那么就不可以操作stack.pop,此时可以给stack赋予底层初值#,并在哈希表中的映射关系为{'#' : '#'},此时若出现stack为空但是又遇见了右括号,则可以不出错地返回false
-
若字符串以左括号结尾,但此时stack中会剩余一个左括号,此时也为false
直接采用栈判断
-
若字符串长度为奇数在一开始就可返回false
-
若是左括号直接入栈
-
右括号则判断当前栈是否为空
-
不为空,栈顶是否为对应地左括号,不匹配直接返回false
-
若为空但是当前又新加入了右括号,自然也是返回false
-
-
最后程序的返回值为return st.empty(),如果还不为空,说明还有左括号,那单独的左括号也是不匹配的
代码
class Solution {
public:
bool isValid(string s) {
int len = s.size();
if(len%2==1) return false; //奇数则直接false
stack<char> st;
for(auto& ch: s){
if(ch == '(' || ch == '{' || ch == '[')
st.push(ch);
else{ //如果是右括号且栈不为空
if(!st.empty()){
if(ch==')'){
int top = st.top();
st.pop();
if(top!='(')
return false;
}
if(ch=='}'){
int top = st.top();
st.pop();
if(top!='{')
return false;
}
if(ch==']'){
int top = st.top();
st.pop();
if(top!='[')
return false;
}
}
else{ //若此时栈已空却又有个括号则false
return false;
}
}
}
return st.empty(); //最后看栈是否为空,不空为false
}
};