链接:LeeCode 20
题目:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例:
输入:s = “{[]}”
输出:true
输入:s = “([)]”
输出:false
方法一: 使用辅助栈和HashMap
思路:
用HashMap放入成对的括号,右括号为 key ,左括号为value,可通过右括号得到对应的左括号;
遍历输入的String,左括号则压栈;右括号则判断此时栈顶是否为对应的左括号,是则弹栈,否则返回flase
class Solution {
public boolean isValid(String s) {
if (s.length()%2==1){ //不成对直接false
return false;
}
Map<Character,Character> pairs =new HashMap<>(){ //集合的双大括号:
{ //根据右括号 匹配 左括号
put(')','(');
put(']','[');
put('}','{');
}};
Stack<Character> stack =new Stack<>(); //创建栈
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(pairs.containsKey(c)){ //如果是右括号
if(stack.empty() || stack.peek()!=pairs.get(c)){
return false;
}else stack.pop(); //弹栈
} //如果是左括号
else stack.push(c); //压栈
}
return stack.empty(); //如果为空则匹配 ,不为空则左括号多了
}
}
注意;此处必须是右括号和栈顶成对,这样才满足括号以正确的顺序闭合,如:"([)]" 是错误的,未按正确的顺序闭合。