LeetCode20.有效的括号
LeetCode20.有效的括号
题目描述
/**
* 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
* <p>
* 有效字符串需满足:
* <p>
* 左括号必须用相同类型的右括号闭合。
* 左括号必须以正确的顺序闭合。
*/
思路分析
1.由题目要求,左括号必须由相同类型的右括号并以正确的顺序闭合,可以马上联想到栈
2.由于栈的先进后出特性,可以先让后入栈的左括号与先拿到的右括号进行比较并判断
3.判断条件,如果拿到右括号,而栈是空的,则不能匹配,或者拿到右括号,栈顶的元素即左括号和右括号不能匹配,则返回false
4.因为要判断字符串的每一个字符是左括号还是右括号,因为要先建立包含这几种括号的集合,由左右括号立刻联想到基于键值对存储的Hashmap,此集合也可以通过键获取值,在使用中可提供很大的便利
5.遍历字符串,然后将拿到的每一个字符和Hashmap集合中的元素对比,判断是左括号还是右括号
- 创建元素基于先进后出特性的栈Stack,遍历字符串,如果拿到的是左括号,则入栈,如果是右括号,则判断并出栈
- 遍历结束后,如果栈是空的,则说明所有的左右符号都能匹配,如果不为空,则说明有多余的括号没有匹配
源码
public static boolean isValid(String s) {
//拿到字符串的长度,并判断如果字符串的长度为奇数,则直接返回false
int len = s.length();
if (len % 2 != 0) {
return false;
}
//将左右括号先存储到HashMap双列集合
HashMap<Character, Character> map = new HashMap<>();
map.put(')','(');
map.put(']','[');
map.put('}','{');
//基于栈的先进后出特性
//测试
//String str = "()[]{}";
Stack<Character> stack = new Stack<>();
//栈中存储左括号
for (int i = 0; i < len; i++) {
//拿到每一个字符
char c = s.charAt(i);
//如果拿到的字符是左括号
if (map.containsValue(c)){
//左括号入栈
stack.push(c);
}else {//如果是右括号
//拿到右括号,并且栈是空的,则不能匹配
if (stack.isEmpty()){
return false;
}
//拿到右括号,但是和栈的顶部字符不匹配
if (stack.peek() != map.get(c)){
return false;
}
//左括号出栈
stack.pop();
}
}
//返回的是最后栈是否为空
return stack.isEmpty();
}

浙公网安备 33010602011771号