20. 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
解题思路
绕了一大圈弯路,也是做过的题,只记得可以用栈来做,但是想到了用其他方法:字符数组的每一位在这一位后面的+1,+3,+5位置处,如果没有找到一个括号和它匹配,则匹配失败。。。这个方法不好解决如果遇到多个右括号。
退而求其次用,又忘了用栈怎么做。。
网上查了一下思路:
思路很简单,实现也不难,就是将字符串的左括号字符入栈,然后比较下一个括号是否和栈顶元素能匹配,如果能匹配,就出栈,如果也是左括号但不能匹配,则再入栈,再次比较下一个字符...,如果遇到右括号不能和栈顶元素匹配,则返回false
代码
class Solution {
public boolean isValid(String s) {
char[] chars = s.toCharArray();
Stack<Character> stack = new Stack<>();
Map<Character,Character> maps = new HashMap<>();
maps.put('(', ')');
maps.put('[', ']');
maps.put('{', '}');
//将特殊情况排除掉
if(s.equals("")){
return true;
}
//将特殊情况排除掉
if(chars[0] == '}' || chars[0] == ')' ||chars[0] == ']' ||
chars[chars.length-1] == '(' || chars[chars.length-1] == '{' ||chars[chars.length-1] == '['){
return false;
}
for (int i = 0; i < chars.length; i++) {
//左括号都入栈
if(chars[i] == '(' || chars[i] == '[' ||chars[i] == '{'){
stack.push(chars[i]);
continue;
}
//栈不为空并且栈顶元素 = 数组元素
if(!stack.isEmpty() && maps.get(stack.peek()) == chars[i]){
//出栈
stack.pop();
}else{
return false;
}
}
//栈空则全部匹配
if(stack.isEmpty()){
return true;
}else{
return false;
}
}
}
测试