代码随想录算法训练营第11天 | 20. 有效的括号、 1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
20. 有效的括号
题目:20. 有效的括号
文档讲解:代码随想录-20. 有效的括号
视频讲解:哔哩哔哩-20. 有效的括号
状态/时间:没写出来/三十分钟
思路:
考虑三种不匹配的情况。
1.左括号多了
2.右括号多了
3.左右括号不匹配例如}{
技巧:
1.遇到左括号存对应的右括号。方便比较。
2.遇到空,就return。
3.剪枝:奇数一定不符合匹配原则。可以直接return
代码:
class Solution {
public boolean isValid(String s) {
if (s.length() % 2 != 0) {
return false;
}
Stack<Character> stack = new Stack<Character>();
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] == '{') {
stack.push('}');
} else if (c[i] == '[') {
stack.push(']');
} else if (c[i] == '(') {
stack.push(')');
} else if (stack.isEmpty() || stack.peek() != c[i]) {
return false;
} else {
stack.pop();
}
}
return stack.isEmpty();
}
}
注意:
如果s的长度是奇数的话,那它肯定不匹配了,可以先进行判断。
1047. 删除字符串中的所有相邻重复项
题目:1047. 删除字符串中的所有相邻重复项
文档讲解:代码随想录-1047. 删除字符串中的所有相邻重复项
视频讲解:哔哩哔哩-1047. 删除字符串中的所有相邻重复项
状态/时间:写出来了/三十分钟
思路:
思路跟字符串匹配是差不多的,每个字符跟栈的原因进行匹配,
不匹配的加到栈,匹配就从栈里删除。
最后倒序从栈输出就好了。
代码:
class Solution {
public String removeDuplicates(String s) {
if (s == null) {
return s;
}
char[] ch = s.toCharArray();
// Stack<Character> stack = new Stack<Character>();
// ArrayDeque的删除性能更好一点
//参考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist
ArrayDeque<Character> deque = new ArrayDeque<>();
for (int j = 0; j < ch.length; j++) {
if (!deque.isEmpty() && ch[j] == deque.peek()) {
deque.pop();
} else {
deque.push(ch[j]);
}
}
String str = "";
//剩余的元素即为不重复的元素
while (!deque.isEmpty()) {
str = deque.pop() + str;
}
return str;
// StringBuilder sb = new StringBuilder();
// while (!stack.empty()) {
// sb.append(stack.pop());
// }
// sb.reverse();
// return new String(sb);
}
}
注意:
150. 逆波兰表达式求值
题目:150. 逆波兰表达式求值
文档讲解:代码随想录-150. 逆波兰表达式求值
视频讲解:哔哩哔哩-150. 逆波兰表达式求值
状态/时间:写出来了/三十分钟
思路:
其实逆波兰表达式相当于是二叉树中的后序遍历
代码:
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<Integer>();
for (int i = 0; i < tokens.length; i++) {
if (tokens[i].equals("+")) {
stack.push(stack.pop() + stack.pop());
} else if (tokens[i].equals("-")) {
// 这里不这样写的就得要来个tmp了,因为是先push的减去后push的
stack.push(-stack.pop() + stack.pop());
} else if (tokens[i].equals("*")) {
stack.push(stack.pop() * stack.pop());
} else if (tokens[i].equals("/")) {
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push(temp2 / temp1);
}else {
// 这里先转换成int类型,下面就不用处理了。
stack.push(Integer.valueOf(tokens[i]));
}
}
return stack.pop();
}
}```
**注意:**
每次把结果计算完,转换成int类型存储比较好