LeetCode20. 有效的括号https://leetcode.cn/problems/valid-parentheses/
LeetCode20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
解题思路:
- 首先,检查输入字符串的长度是否小于等于1或者是否为奇数,如果是,则直接返回false。
- 创建一个HashMap,用于存储左右括号的对应关系。
- 创建一个栈,用于辅助括号匹配。
- 遍历输入字符串的每一个字符:
- 如果当前字符是左括号,将其压入栈中。
- 如果当前字符是右括号:
- 如果栈不为空,弹出栈顶元素作为左括号。
- 根据左括号在HashMap中查找对应的右括号。
- 如果当前字符不等于右括号,说明括号不匹配,返回false。
- 如果栈已经为空,说明右括号多于左括号,返回false。
- 最后,检查栈是否为空,如果为空,则说明所有左括号都找到了对应的右括号,返回true;否则返回false,说明左括号多于右括号。
我这里直接画一个流程图应该会更好理解一点~
代码如下:
boolean isValid(String s) {
if(s.length()<=1 || s.length() % 2 == 1{
return false; // 如果字符串长度小于等于1或者为奇数,直接返回false
}
Map<Character,Character> smap = new HashMap<>(); // 创建一个Map用于存储左右括号对应关系
smap.put('(',')'); // 将括号对应关系存入Map
smap.put('{','}');
smap.put('[',']');
Stack<Character> stack = new Stack<>(); // 创建一个栈用于辅助括号匹配
for(int i=0;i<s.length();i++){ // 遍历字符串的每一个字符
char item = s.charAt(i); // 获取当前字符
if(smap.containsKey(item)){ // 如果当前字符为左括号
stack.push(item); // 将左括号入栈
}else{ // 如果当前字符为右括号
if(!stack.isEmpty()){ // 如果栈不为空
Character left = stack.pop(); // 出栈一个左括号
char rightchar = smap.get(left); // 根据左括号获取对应的右括号
if(rightchar != item){ // 如果当前字符不等于右括号
return false; // 返回false,说明括号不匹配
}
}else {
return false; // 栈为空,说明右括号多于左括号,返回false
}
}
}
return stack.isEmpty(); // 最后判断栈是否为空,如果为空则说明括号全部匹配,返回true;否则返回false,说明左括号多于右括号
}
这题标着简单,但是我感觉挺难的...