20. 有效的括号
栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1:
- 输入: "()"
- 输出: true
示例 2:
- 输入: "()[]{}"
- 输出: true
示例 3:
- 输入: "(]"
- 输出: false
示例 4:
- 输入: "([)]"
- 输出: false
示例 5:
- 输入: "{[]}"
- 输出: true
主要在写代码之前要分析清楚3种情况:
1、左括号多余,栈不为空,不匹配;
2、右括号多余,在匹配过程中,栈已经为空,栈中找不到可以匹配的元素,不匹配;
3、括号类型不匹配,匹配完成后,栈中找不到匹配的元素,不匹配;
综合代码:
class Solution {
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();
}
}
1047. 删除字符串中的所有相邻重复项
ArrayDeque在删除元素上比LinkedList快:
class Solution{
public String removeDuplicates(String s){
ArrayDeque<Character> deque = new ArrayDeque<>();
char ch;
for(int i = 0; i<s.length(); i++){
ch = s.charAt(i);
if(deque.isEmpty() || deque.peek() != ch){
deque.push(ch);
}
else{
deque.pop();
}
}
String str = "";
while(!deque.isEmpty()){
str = deque.pop() + str;
}
return str;
}
}