问题描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
问题分析
- 做前扫描了下题解,主要用栈。那么就要充分利用它先进后出的特性;
- 注意审题,像用例4这种是不对的。要么一对不被隔开;即使被隔开了,括号仍然是关于中轴线对称的。那么就要好好利用这一特性。
- 设计:遇到左半个符号入栈;遇到右半个符号要看栈是不是空,空错,因为没有和它匹配的符号。或者看栈顶是不是对应的左符号,不是 直接 return false,是的话 pop。这样循环下去,如果 栈stk 一直为空,那么 string s 就是有效字符串。和题目特性对应似乎有点不上,回去补个图上来。
代码
class Solution {
public:
bool isValid(string s) {
if (s.length() % 2 == 1) return false;
stack<char> stk;
for(char c : s) {
switch(c) {
case '{' :
case '(' :
case '[' : stk.push(c); break;
case '}' : if (stk.empty() || stk.top() != '{') return false; else stk.pop(); break;
case ']' : if (stk.empty() || stk.top() != '[') return false; else stk.pop(); break;
case ')' : if (stk.empty() || stk.top() != '(') return false; else stk.pop(); break;
default : ;
}
}
return stk.empty();
}
};
- 这么精妙的设计当然不是我做的,感谢 vscode fetch 到了 Leetcode 用户 chammika 的方法。我也就是愚拙的分析一下。他让栈就像有生命一样。感叹。