难度:简单
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
示例1:
输入:s = "(]"
输出:false
示例2:
输入:s = "()[]{}"
输出:true
-
1 <= s.length <= 10^4
-
s 仅由括号 '()[]{}' 组成
问题分析
这题是让判断字符串 s 是否是有效的括号,对于括号匹配问题,我们首先想到的是使用栈。
因为字符串 s 只包含 '()[]{}' ,如果遇到左括号,比如 '(','[','{' ,就把与它们对应的右括号压入到栈中。
如果遇到右括号,比如 ')',']','}' ,栈顶元素就出栈,然后判断右括号和出栈的元素是否相等,如果不相等或者栈为空,说明不是有效的括号,直接返回 false 。
JAVA:
public boolean isValid(String s) {
Stack<Character> stk = new Stack<>();// 创建一个栈
for (char ch : s.toCharArray()) {
// 如果是左括号,就把他们对应的右括号压栈
if (ch == '(') {
stk.push(')');
} else if (ch == '{') {
stk.push('}');
} else if (ch == '[') {
stk.push(']');
} else if (stk.isEmpty() || stk.pop() != ch) {
return false;
}
}
// 如果是有效的括号,左括号和右括号必须匹配,栈为空,否则就无效。
return stk.isEmpty();
}
C++:
public:
bool isValid(string s) {
stack<char> stk; // 创建一个栈
for (char ch: s) {
// 如果是左括号,就把他们对应的右括号压栈
if (ch == '(') {
stk.push(')');
} else if (ch == '{') {
stk.push('}');
} else if (ch == '[') {
stk.push(']');
} else {
if (stk.empty() || stk.top() != ch)
return false;
stk.pop();
}
}
// 如果是有效的括号,左括号和右括号必须匹配,栈为空,否则就无效。
return stk.empty();
}
Python:
def isValid(self, s: str) -> bool:
stk = [] # 创建一个栈
for ch in s:
# 如果是左括号,就把他们对应的右括号压栈
if ch == '(':
stk.append(')')
elif ch == '{':
stk.append('}')
elif ch == '[':
stk.append(']')
elif not stk or stk.pop() != ch:
return False
# 如果是有效的括号,左括号和右括号必须匹配,栈为空,否则就无效。
return not stk