给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
```python
输入: "{[]}"
输出: true
判断字符串中给关于括号的有效性,使用栈保存左括号,如果入栈的是右括号,则将其和栈顶元素进行比较:
- 如果两者不匹配,直接放回False
- 否则栈顶元素出栈,右括号不入栈
- 最后判断栈是否为空
class Solution(object):
def isValid(self, s):
stack = []
d = {")": "(", "}": "{", "]": "["}
for i in s:
if i == '(' or i == '{' or i == '[':
stack.append(i)
else:
# 如果是右括号则判断当前栈顶元素是否是对应的左括号
# 如果是则弹出栈顶元素,同时右括号不入栈
# 否则直接返回False
if stack and d[i] == stack[-1]:
stack.pop()
else:
return False
return stack == []
2020 - 8 - 1 更新Java代码, Java的实现需要使用Stack和Map这两个容器,本质上和Python的实现逻辑是一致的,如下所示:
class Solution {
public boolean isValid(String s) {
Map<Character, Character> map = new HashMap<>();
map.put('}', '{');
map.put(')', '(');
map.put(']', '[');
Stack<Character> helper = new Stack<>();
for (int i = 0; i < s.length(); i++) {
Character c = s.charAt(i);
// 判断是否为左括号
if (map.containsKey(c)) {
// 如果是左括号,看它在map中的值和栈顶元素的匹配情况
Character value = map.get(c);
// 获取栈顶元素
char top = helper.isEmpty() ? '$' : helper.peek();
// 如果不匹配,直接返回false
if (value != top) {
return false;
} else {
// 如果匹配,只将栈顶元素弹出
helper.pop();
}
} else {
// 如果栈中没有,则入栈
helper.push(c);
}
}
return helper.isEmpty();
}
}