目录
Leetcode 20 有效的括号
题目链接:Leetcode 有效的括号
文字讲解:代码随想录 有效的括号
视频讲解:b站视频
学习记录:
其实没有那么复杂,总共可以归结为3种情况:
- 左括号多了
- 右括号多了
- 左右括号不匹配
处理的之后妙啊!先遇到左括号,在栈中放入对应的右括号,然后一一进行对比,如果匹配就弹出。到最后如果栈不为空,说明左括号多了;如果栈不够,说明右括号多了;如果不匹配,说明左右括号不匹配。
另外还可以考虑额外的剪枝操作,妙啊!如果字符串长度为奇数,直接排除!
编译器在 词法分析的过程中处理括号、花括号等这个符号的逻辑,是使用了栈这种数据结构。
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
char[] ch = s.toCharArray();
if(ch.length%2==1){
return false;
}
for(int i=0;i<ch.length;i++){
if(ch[i]=='('){
stack.push(')');
}
else if(ch[i]=='['){
stack.push(']');
}
else if(ch[i]=='{'){
stack.push('}');
}
else if(stack.isEmpty() || ch[i]!=stack.peek()){
return false;
}
else{
stack.pop();
}
}
return stack.isEmpty();
}
}
Leetcode 1047 删除字符串中的所有相邻重复项
文字讲解:代码随想录 删除字符串中的所有相邻重复项
视频讲解:b站视频
第一想法:
借助一个栈,从前往后遍历这个字符串,如果当前字符和栈里面的第一个字符内容相等,栈里面的内容就弹出,不同就入栈,最后栈里面剩下的就是无重复的内容,然后将其按顺序保存在一个数组里面,然后数组转成字符串输出。
class Solution {
public String removeDuplicates(String s) {
Stack<Character> stack = new Stack<>();
char[] ch = s.toCharArray();
stack.push(ch[0]);
for(int i=1; i<ch.length; i++){
if(!stack.isEmpty() && ch[i]==stack.peek()){
stack.pop();
}
else{
stack.push(ch[i]);
}
}
char[] result = new char[stack.size()];
for(int i=stack.size()-1;i>=0;i--){
result[i] = stack.pop();
}
return new String(result);
}
}
学习记录:
和我的第一想法的过程一样,开心!
此处再附上一个双指针的操作
class Solution {
public String removeDuplicates(String s) {
char[] ch = s.toCharArray();
int fast = 0;
int slow = 0;
while(fast < s.length()){
// 直接用fast指针覆盖slow指针的值
ch[slow] = ch[fast];
// 遇到前后相同值的,就跳过,即slow指针后退一步,下次循环就可以直接被覆盖掉了
if(slow > 0 && ch[slow] == ch[slow - 1]){
slow--;
}else{
slow++;
}
fast++;
}
return new String(ch,0,slow);
}
}
Leetcode 150 逆波兰表达式求值
题目链接:Leetcode 逆波兰表达式求值
文字讲解:代码随想录 逆波兰表达式求值
视频讲解:b站视频
第一想法:
遇到数字先存数到栈里面,然后遇到了符号之后,找到其对应操作要用到的数字,也就是当前栈顶的两个数字,先pop出来,要注意顺序,然后计算结果,将计算得到的结果push入栈,重复以上操作,直到栈为空。
其中还涉及到了字符串转成数字的问题。
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(int i=0; i<tokens.length; i++){
if("+".equals(tokens[i])){
int a=stack.pop();
int b=stack.pop();
stack.push(b+a);
}
else if("-".equals(tokens[i])){
int a=stack.pop();
int b=stack.pop();
stack.push(b-a);
}
else if("*".equals(tokens[i])){
int a=stack.pop();
int b=stack.pop();
stack.push(b*a);
}
else if("/".equals(tokens[i])){
int a=stack.pop();
int b=stack.pop();
stack.push(b/a);
}
else{
int temp = Integer.parseInt(tokens[i]);
stack.push(temp);
}
}
return stack.pop();
}
}
学习记录:
和我的想法一摸一样。