20.有效的括号
思路:只要我逐个遍历,如果是' ( ',下一个就必须是' ) ',这样不就行了,但是这样想的话,好像又太简单了。或者是,我统计左边和右边的字符,因为有效的必然是偶数,然后左边的括号数量和右边的括号数量三种类型一定是一致的,我直接搞一个数组存一下不久行了,两个数组,一左一右,最后对比,或者是直接一个数组,先累加,再累减,最后数组元素应该全是0
第二个思路,快慢指针,一个指针留在原地,一个指针寻找另一半括号,找到之后两个指针做差,看差是否为偶数,也不行,( { [ ) } ]的情况就会漏掉
尝试
class Solution {
public boolean isValid(String s) {
int[] res = new int[3];
if(s.length()%2!=0) return false;
for(int i=0;i < s.length(); i++){
if(s.charAt(i)='('){
res[0]++;
}
if(s.charAt(i)='{'){
res[1]++;
}
if(s.charAt(i)='['){
res[2]++;
}
}
for(int i=0;i < s.length(); i++){
if(s.charAt(i)=')'){
res[0]--;
}
if(s.charAt(i)='}'){
res[1]--;
}
if(s.charAt(i)=']'){
res[2]--;
}
}
for(int i : res){
if(i != 0){
return false;
}
}
return true;
}
}
4/27 看完视频后
class Solution {
public boolean isValid(String s) {
Stack<Character> res = new Stack<>();
if(s.length() % 2 != 0) return false;
for(int i = 0; i < s.length(); i++){
if(s.charAt(i)=='(') res.push(')');
if(s.charAt(i)=='{') res.push('}');
if(s.charAt(i)=='[') res.push(']');
if(s.charAt(i)==')' || s.charAt(i)=='}' || s.charAt(i)==']'){
if(!res.isEmpty() && s.charAt(i)==res.peek()){
res.pop();
}else{
return false;
}
};
}
if(res.isEmpty()){
return true;
}
return false;
}
}
小结
- 属于是思路完全错误
- 可以用Deque来实现栈
1047.删除字符串中的所有相邻重复项
题目:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
思路:可以用栈来判断当前字符,和上一个字符是否相同,难点在于,什么时候停下来,反复删除的话,岂不是要用递归,要么就搞一个计数器,只要遍历之后,一次都没有从栈内弹出元素,即此时不存在相邻重复项
第二个思路:从字符串尾部往前遍历,每个元素都推入栈中,每次推入就判断当前推入元素和栈顶元素是否相同,相同就弹出栈顶元素,不同就推入,最后把元素取出,append到StringBuilder里面
尝试
小结
思路没错,就是java基础的语法出错了
🍉要用LinkedList初始化Deque,【Deque<Character> res = new LinkedList<>();】
🍉初始化字符,✔【char ch;】 ❌【char ch = new Character();】
150.逆波兰表达式求值
题目:150. 逆波兰表达式求值 - 力扣(LeetCode)
思路:我记得操作系统内部的计算,好像就是用逆波兰的方式,要用到栈。
1. 定义两个栈,左栈(存储计算结果),右栈(存储数字和运算符)
2. 从尾部开始遍历,把所有内容存入到右栈
3. 逐个从右栈弹出元素,塞入到左栈,一旦右栈弹出运算符,就从左栈弹出两个元素,计算完之后再推入左栈,以此类推
尝试
class Solution {
public int evalRPN(String[] tokens) {
Deque<String> left = new LinkedList<>();
Deque<String> right = new LinkedList<>();
for(int i = tokens.length-1;i >=0; i-- ){
right.push(tokens[i]);
}
while(!right.isEmpty()){
String ch = right.pop();
if(ch.isDigit()){
left.push(ch);
}else{
int first = left.pop();
int second = left.pop();
if(ch == '*'){
left.push(first * second);
}else if(ch == '/'){
left.push(first / second);
}else if(ch == '+'){
left.push(first + second);
}else{
left.push(first - second);
}
}
}
return Integer.parseInt(left.pop());
}
}
小结
- 一个栈就可以实现,遇到运算符就计算,不是运算符就推入
- 🍉Integer.valueOf(s),可以把字符串转换为数字