给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
解题思路:
1 栈方法。预先准备左右括号的配对map。key是右括号,value是左括号。准备一个空栈
2 从左到右遍历字符串
a、如果是左括号,直接push到栈中
b、如果只右括号,当前仅当栈顶元素和该右括号匹配时可以继续往下遍历。命中以下情况返回false
Ⅰ 空栈
Ⅱ 栈顶元素与该右括号不匹配
如果匹配,则弹出栈顶原色并且往下遍历。直到全部匹配成功。
Java代码:
class Solution {
public boolean isValid(String s) {
if(s.length()%2==1){
return false;
}
HashMap<Character, Character> maps = new HashMap<>();
Stack<Character> stack = new Stack<>();
maps.put(')', '(');
maps.put(']', '[');
maps.put('}', '{');
int i=0;
while(i<s.length()){
if(!maps.containsKey(s.charAt(i))){
stack.push(s.charAt(i));
}else{
if(stack.isEmpty()){
return false;
}else if(stack.peek()!=maps.get(s.charAt(i))){
return false;
}else{
stack.pop();
}
}
i++;
}
return stack.isEmpty();
}
}
Python代码
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
if len(s) % 2 == 1:
return False
maps = {}
stack = []
maps[')'] = '('
maps[']'] = '['
maps['}'] = '{'
i = 0
while i < len(s):
if s[i] not in maps:
stack.append(s[i])
else:
if len(stack) == 0:
return False
elif stack[-1] != maps[s[i]]:
return False
else:
stack.pop()
i += 1
return len(stack) == 0