LeetCode-20-有效的括号
题意描述:
给定一个只包括 '(',')','{','}','[',']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例:
示例1:
输入: "()"
输出: true
示例2:
输入: "()[]{}"
输出: true
示例3:
输入: "(]"
输出: false
示例4:
输入: "([)]"
输出: false
示例5:
输入: "{[]}"
输出: true
解题思路:
Alice: 这道题好熟悉啊。
Bob: 大三的时候的编译原理的课上可能有这道题目,或者大二数据结构的课上也可能有这道题目。
Alice: emmm, 应该是数据结构的课堂习题? 反正我会做。
Bob: 哦豁?
Alice: 就是先整一个空的栈,然后遍历整个字符串,如果遇到左括号就入栈,如果遇到右括号而且栈顶是对应的左括号就出栈,如果遇到的右括号而且栈顶不是对应的左括号就意味着已经匹配失败了。这样一直遍历,如果最好又变成了空栈,就是匹配的,否则就不是。
Bob: w(゚Д゚)w哇哦
Alice: 小老弟,士别三日该怎么着来着?
Bob: 如隔三秋?┓( ´∀` )┏
Alice: 刮目相待!!jj(・`ω´・)
代码:
Python 方法一:使用列表模拟栈
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for x in s:
if x == '(' or x == '{' or x == '[': // 左括号就入栈
stack.append(x)
else: // 右括号且当前栈顶待匹配的右括号与之相对应,就出栈。
if x == ')' and len(stack) >= 1 and stack[-1] == '(':
stack.pop()
elif x == ']' and len(stack) >= 1 and stack[-1] == '[':
stack.pop()
elif x == '}' and len(stack) >= 1 and stack[-1] == '{':
stack.pop()
else: // 否则就是"(]"这种不匹配的情况
return False
return len(stack) == 0 // 如果一一匹配,最后栈应该为空,像"(()"就是不能一一匹配的了。
C++ 方法一: 使用vector
模拟栈
#include <vector>
using namespace std;
class Solution {
public:
bool isValid(string s) {
vector <char> stack;
for(int i=0; i<s.size(); ++i){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
stack.push_back(s[i]);
}else{
if(s[i] == '}' && stack.size() > 0 && stack.back() == '{'){
stack.pop_back();
}else if(s[i] == ']' && stack.size() > 0 && stack.back() == '['){
stack.pop_back();
}else if(s[i] == ')' && stack.size() > 0 && stack.back() == '('){
stack.pop_back();
}else{
return false;
}
}
}
return stack.size() == 0;
}
};
Java 方法一:用了Stack, 但是用的不太熟,所以应该还可以写的更简单一些。
class Solution {
public boolean isValid(String s) {
Stack stack = new Stack();
for(int i=0; i<s.length(); ++i){
if(s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '['){
stack.push(s.charAt(i));
}else{
if(s.charAt(i) == ')' && !stack.empty() && (char)(stack.peek()) == '('){
stack.pop();
}else if(s.charAt(i) == ']' && !stack.empty() && (char)(stack.peek()) == '['){
stack.pop();
}else if(s.charAt(i) == '}' && !stack.empty() && (char)(stack.peek()) == '{'){
stack.pop();
}else{
return false;
}
}
}
return stack.empty();
}
}
易错点:
- 应当考虑到只有右括号而没有左括号的情况。
- 应当考虑到字符串为空串的边界值情况。
附赠三个测试样例:
")("
"))))"
""
总结:
经典的题目,经典的做法,这道题目就是为栈这种数据结构设计的,也可以说栈就是这道题的法门!