描述
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
思路
典型的栈的应用,遇到左括号入栈,右括号则出栈比对。用一个map维护左右括号的映射关系。
时间复杂度O(N),空间复杂度O(N)
代码
Java
class Solution {
//利用map存储括号映射关系
private HashMap<Character,Character> mappings;
//初始化映射关系
public Solution(){
mappings = new HashMap<Character,Character>();
mappings.put(')','(');
mappings.put(']','[');
mappings.put('}','{');
}
//左入栈 右出栈
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for(int i = 0;i<s.length();i++){
char cur = s.charAt(i);
if(mappings.containsKey(cur)){
//右
char top = stack.isEmpty()? '#' : stack.pop();
if(top != mappings.get(cur)){
return false;
}
}else{
stack.push(cur);
}
}
return stack.isEmpty();
}
}
Python
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
# 存储元素
stack = []
# 映射关系
mappings = {")":"(","]":"[","}":"{"}
for c in s:
if c in mappings:
# 右
top = stack.pop()if stack else "#"
if top != mappings[c]:
return False
else:
# 左
stack.append(c)
return not stack
"""
注:
if stack 如果列表为空 则为false
top = stack.pop()if stack else "#" 先执行if 为空则返回"#"否则弹出第一个 解决了空指针问题
"""