标题 | 20. 有效的括号 |
难度 | 简单 |
天数 | 第9天,第1/2题 |
数据结构 | 栈 / 队列 |
描述:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入: s = “()”
输出: true
示例 2:
输入: s = “()[]{}”
输出: true
示例 3:
输入: s = “(]”
输出: false
示例 4:
输入: s = “([)]”
输出: false
示例 5:
输入: s = “{[]}”
输出: true
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
以上内容来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
- 首先了解Deque 的几个方法
push(e)
如果可以在不违反容量限制的情况下,立即将元素推送到此双端队列表示的堆栈上(换句话说,在此双端队列的头部)
pop()
从这个双端队列表示的堆栈中弹出一个元素。换句话说,删除并返回此双端队列的第一个元素。
peek()
检索但不删除此双端队列表示的队列的头部(换句话说,此双端队列的第一个元素),如果此双端队列为空 ,则返回null 。
- 如果匹配左括号就添加对应右括号到堆栈中
ch = s.charAt(i);
if(ch =='('){
deque.push(')');
}else if(ch =='['){
deque.push(']');
}else if (ch == '{'){
deque.push('}');
}
- 1如果当前是右括号,但是栈已经空了,代表不匹配
if(deque.isEmpty()){
return false;
}
- 2 如果当前是右括号,但是栈顶和当前符合不匹配
ch = s.charAt(i);
if(deque.peek() != ch){
return false;
}
- 其他情况就弹栈
else{
deque.pop();
}
完整代码:
class Solution {
//数据结构 第 9 天 1/2 栈 / 队列
public boolean isValid(String s) {
Deque<Character> deque = new LinkedList<>();
char ch;
for(int i = 0 ; i < s.length();i++){
ch = s.charAt(i);
if(ch =='('){
deque.push(')');
}else if(ch =='['){
deque.push(']');
}else if (ch == '{'){
deque.push('}');
}else if(deque.isEmpty() || deque.peek() != ch){
//栈空了 或者栈顶元素不匹配
return false;
}else{
deque.pop();
}
}
//
return deque.isEmpty();
}
}
早期写的版本
class Solution {
public boolean isValid(String s) {
//不是偶数,必然不匹配,直接返回
if(s.length() % 2 != 0){
return false;
}
//只存左括号字符,如果最后一位匹配,就删除掉最后一位匹配的字符,类似消除游戏
List list =new ArrayList();
//创建字典 key记录左括号,value记录右括号
Map<Character,Character> map = new HashMap();
map.put('(',')');
map.put('[',']');
map.put('{','}');
//遍历字符串取字符
for(int i = 0;i < s.length();i++){
//取字符
char item = s.charAt(i);
//如果字符是右括号,就开始判断是否符合规则
if(item == ')' || item == '}'||item == ']'){
//从list取出字符获取对应值,和当前字符匹配,不匹配代表不符合规则
int prevIndex = list.size()-1;
/**
* list.get(prevIndex) 取最后一个元素
* map.get(list.get(prevIndex)) 取出字典对应的左括号
* item != map.get(list.get(prevIndex)) 如果取出的左括号和当前有括号不匹配
* 代表不符合规则
*/
if(prevIndex < 0 || item != map.get(list.get(prevIndex))){
return false;
}else{
//如果最后一位匹配 就删除掉list最后一个字符
list.remove(prevIndex);
}
}else{
//如果是左括号就添加进list
list.add(item);
}
}
return list.size() == 0;
}
}