[LeetCode] 20_有效的括号
题目要求
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
题目分析
- 建立一个栈,当输入’(’, ‘[’, '{'时,将字符存入栈中
- 当输入’)’, ‘]’, '}'时,如果栈为空,则失败;如果栈不为空,当栈顶与字符不匹配时,失败,否则将从栈中退出一个字符(即退出匹配的字符)
- 当整个字符串都遍历完时,若栈不为空则失败,否则成功
注意点
要学会合理而全面地分析情况,抓住本质,不要拘泥于细枝末节。一开始我是选择讨论各种情况,导致代码很繁琐,而且总有疏漏。
这道题很重要的一部分在于消除,当括号能够匹配时就可以进行消除,如果消除不完或者匹配错误就返回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();
}
};