20. 有效的括号
[题目链接 ](20. 有效的括号 - 力扣(Leetcode))
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
解法:使用栈来解,遍历字符串s,当我们遇到左括号时,后遇到的左括号一定先有右括号匹配,因此我们可以把这个后遇到的左括号放入栈顶;所以一旦遇到右括号,直接看栈顶是否匹配即可;
- 如果是左括号,则入栈
- 如果是右括号,判断栈顶元素是否匹配,如果匹配,栈顶弹出
- 如果是右括号,判断栈是否是空,空的话没用可匹配的元素,return false
- 遍历结束后,如果栈为空,则所有括号都匹配完成,return true;
class Solution {
public boolean isValid(String s) {
Deque<Character> stack = new LinkedList<>();
if (s.length() % 2 == 1) {
return false;
}
Map<Character, Character> map = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
for (char c : s.toCharArray()) {
// 右括号,判断是否和栈顶元素匹配
if (map.containsKey(c)) {
if (stack.isEmpty() || stack.peek() != map.get(c)) {
return false;
}
// 匹配,栈顶弹出
stack.pop();
} else { // 左括号入栈
stack.push(c);
}
}
return stack.isEmpty();
}
}
1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
解法:遍历s,如果等于栈顶元素,则栈顶元素弹出,否则入栈;最后栈底到栈顶组成的字符串就是结果
class Solution {
public String removeDuplicates(String s) {
Deque<Character> stack = new LinkedList<>();
for (char c : s.toCharArray()) {
if (stack.isEmpty() || c != stack.peek()) {
stack.push(c);
} else {
stack.pop();
}
}
String result = "";
while (!stack.isEmpty()) {
result = stack.pop() + result;
}
return result;
}
}
150. 逆波兰表达式求值
解法:遍历逆波兰表达式,如果是数字,入栈;如果是符号,弹出栈顶两个元素进行运算,运算结果入栈;
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList<>();
for (String s : tokens) {
if ("+".equals(s)) {
stack.push(stack.pop() + stack.pop());
} else if ("-".equals(s)) {
// 后弹的减先弹的
stack.push(-stack.pop() + stack.pop());
} else if ("*".equals(s)) {
stack.push(stack.pop() * stack.pop());
} else if ("/".equals(s)) {
// 后弹的除以先弹的
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push(temp2 / temp1);
} else {
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}