问题描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例
输入: "()"
输出: true
输入: "()[]{}"
输出: true
输入: "(]"
输出: false
输入: "([)]"
输出: false
输入: "{[]}"
输出: true
思路
数据结构-栈的经典问题。
遇到左括号,入栈。遇到右括号,如果栈为空,return false. 如果栈不为空,但栈顶元素与右括号不配对,return false. 否则的话出栈。
处理完之后,如果栈为空,return true. 否则false.
当然啦可以优化一下,如果这个括号序列是奇数的,则可以直接返回false了。
解决方案Java版
class Solution {
public boolean isValid(String s) {
if((s.length()&1) == 1){
return false;
}
Stack<Character> stack = new Stack<>();
Map<Character,Character> map = new HashMap<>();
Set<Character> left = new HashSet<>();
init(map,left);
for(int i = 0; i < s.length(); i++){
if(left.contains(s.charAt(i))){
stack.push(s.charAt(i));
}else if(stack.empty()){
return false;
}else if(map.get(s.charAt(i)) != stack.peek()){
return false;
}else{
stack.pop();
}
}
return stack.empty();
}
private void init(Map<Character,Character> map,Set<Character> set){
map.put(')','(');
map.put(']','[');
map.put('}','{');
set.add('(');
set.add('[');
set.add('{');
}
}
解决方案Python版
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
if s == '': # 空字符串直接返回True
return True
elif len(s)&1:
return False
stack = []
for i in s:
if i == '{' or i == '(' or i == '[':
stack.append(i)
else:
if not len(stack): # 右侧符号遇到栈空,直接返回False
return False
if i == '}' and stack[-1] == '{':
stack.pop()
elif i == ')' and stack[-1] == '(':
stack.pop()
elif i == ']' and stack[-1] == '[':
stack.pop()
else:
return False # 栈外没有与栈顶配对,返回False
if len(stack): # 处理完之后栈非空,返回False
return False
return True