一、题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
二、思路
利用栈来实现:
- 初始化一个 Map,给三种括号建立映射关系,方便后面的匹配判断;
- 初始化栈 stack;
- 依次处理字符串表达式的每个括号;
- 如果遇到左括号,将其入栈;
- 如果遇到右括号,将栈顶元素弹出,然后判断弹出的左括号和该右括号是否匹配。如匹配,则继续处理剩下的括号;若不匹配,说明该表达式无效。
- 最后,如果栈中还有元素,说明该表达式无效。
举个例子:
给定字符串为 “{ [ ( ) ( ) ] }”,过程如下:
- 遇到左括号就入栈,即 "{ [ ( " 依次入栈,得到
| ( |
| [ |
| { | - 下一个字符为 “)”,则弹出栈顶元素 “(”,匹配。此时
| [ |
| { | - 下一个字符为 “(”,将其入栈,得到
| ( |
| [ |
| { | - 下一个字符为 “)”,则弹出栈顶元素 “(”,匹配。此时
| [ |
| { | - 下一个字符为 “]”,则弹出栈顶元素 “[”,匹配。此时
| { | - 下一个字符为 “}”,则弹出栈顶元素 “{”,匹配。此时字符串处理完毕,且栈为空,说明全部匹配,该字符串有效。
三、代码
class Solution {
public boolean isValid(String s) {
Map<Character, Character> map = new HashMap<>();
// 注意:右括号为键,左括号为值,方便后续判断。
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
LinkedList<Character> stack = new LinkedList<>();
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);// 取一个字符
if(map.containsKey(c)){// 拿到了一个右括号,与栈顶元素匹配
// 这里,如果第一个就遇到右括号,而此时栈为空,是不能弹出元素的,所以随便赋一个字符即可,
// 这种情况肯定是无效的。
char top = stack.isEmpty() ? '#' : stack.pop();
if(top != map.get(c))
return false;
}else{// 拿到了一个左括号,入栈
stack.push(c);
}
}
return stack.isEmpty();
}
}