
⚙️个人专栏:
《Java算法时空: 图解手撕原理》 《 多线程 》 《JavaSE基础原理 》 《数据结构》
✨与其内耗自己,不如责备他人



目录
[一. 力扣 1047. 删除字符串中的所有相邻重复项](#一. 力扣 1047. 删除字符串中的所有相邻重复项)
[1. 题目](#1. 题目)
[2. 算法原理](#2. 算法原理)
[3. 代码](#3. 代码)
[二. 力扣 844. 比较含退格的字符串](#二. 力扣 844. 比较含退格的字符串)
[1. 题目](#1. 题目)
[2. 算法原理](#2. 算法原理)
[3. 代码](#3. 代码)
[三. 力扣 227. 基本计算器 II](#三. 力扣 227. 基本计算器 II)
[1. 题目](#1. 题目)
[2. 算法原理](#2. 算法原理)
[3. 代码](#3. 代码)
[四. 力扣 394. 字符串解码](#四. 力扣 394. 字符串解码)
[1. 题目](#1. 题目)
[2. 算法原理](#2. 算法原理)
[3. 代码](#3. 代码)
[五. 力扣 946. 验证栈序列](#五. 力扣 946. 验证栈序列)
[1. 题目](#1. 题目)
[2. 算法原理](#2. 算法原理)
[3. 代码](#3. 代码)
一. 力扣 1047. 删除字符串中的所有相邻重复项
1. 题目
题目的意思不难理解,删除相同元素,有点像开心消消乐
2. 算法原理
3. 代码
java
public String removeDuplicates(String s) {
StringBuilder stringBuilder = new StringBuilder();
int cur = -1;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (cur != -1) {
char c = stringBuilder.charAt(cur);
if (ch == c) {
stringBuilder.deleteCharAt(cur);
cur--;
}else {
stringBuilder.append(ch);
cur++;
}
}else {
stringBuilder.append(ch);
cur++;
}
}
return stringBuilder.toString();
}
二. 力扣 844. 比较含退格的字符串
1. 题目
2. 算法原理
与上面那道题原理一致,这里不过多赘述,需要注意,如果对空文本输入退格字符,文本继续为空,意味着可能#比有效字符多
3. 代码
java
public boolean backspaceCompare(String s, String t) {
StringBuilder tmp1 = new StringBuilder();
StringBuilder tmp2 = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (tmp1.length() != 0 && ch == '#') {
tmp1.deleteCharAt(tmp1.length() - 1);
}else {
if (ch != '#') {
tmp1.append(ch);
}
}
}
for (int i = 0; i < t.length(); i++) {
char ch = t.charAt(i);
if (tmp2.length() != 0 && ch == '#') {
tmp2.deleteCharAt(tmp2.length() - 1);
}else {
if (ch != '#') {
tmp2.append(ch);
}
}
}
return tmp1.toString().equals(tmp2.toString());
}
三. 力扣 227. 基本计算器 II
1. 题目
遇到计算求值类型的题目, 别犹豫, 直接上栈
2. 算法原理
3. 代码
java
public int calculate(String s) {
Stack<Integer> stack = new Stack<Integer>();
char op = '+';
int i = 0;
int n = s.length();
while (i < n) {
char ch = s.charAt(i);
if (ch == ' ') {
i++;
}else if (ch >= '0' && ch <= '9') {
int tmp = 0;
while (i < n && ch >= '0' && ch <= '9') {
tmp = tmp * 10 + (ch - '0');
i++;
if (i < n) {
ch = s.charAt(i);
}
}
if (op == '+') {
stack.push(tmp);
}else if (op == '-') {
stack.push(-tmp);
}else if (op == '*') {
stack.push(stack.pop() * tmp);
}else {
stack.push(stack.pop() / tmp);
}
}else {
op = ch;
i++;
}
}
int sum = 0;
while (!stack.isEmpty()) {
sum += stack.pop();
}
return sum;
}
四. 力扣 394. 字符串解码
1. 题目
类似于加括号的计算器运算, 这里也是先计算括号里面的, 但不同的是括号中的是字母,我们要根据括号外面的数字字符,来进行对应次数的复制
2. 算法原理
3. 代码
java
public String decodeString(String s) {
Stack<String> zs = new Stack<>();
Stack<Integer> zi = new Stack<>();
zs.push("");
int i = 0;
int n = s.length();
char[] c = s.toCharArray();
while (i < n) {
if (c[i] >= '0' && c[i] <= '9' ) {
int num = 0;
while (i < n && c[i] >= '0' && c[i] <= '9') {
num = num * 10 + (c[i] - '0');
i++;
}
zi.push(num);
}else if (c[i] == '[') {
i++;
StringBuilder stringBuilder = new StringBuilder();
while (i < n && c[i] >= 'a' && c[i] <= 'z') {
stringBuilder.append(c[i]);
i++;
}
zs.push(stringBuilder.toString());
}else if (c[i] == ']') {
int j = zi.pop();
String tmp = zs.pop();
StringBuilder ret = new StringBuilder();
while (j > 0) {
ret.append(tmp);
j--;
}
i++;
String concat = zs.pop().concat(ret.toString());
zs.push(concat);
}else {
StringBuilder stringBuilder = new StringBuilder();
while (i < n && c[i] >= 'a' && c[i] <= 'z') {
stringBuilder.append(c[i]);
i++;
}
String concat = zs.pop().concat(stringBuilder.toString());
zs.push(concat);
}
}
return zs.pop();
}
五. 力扣 946. 验证栈序列
1. 题目
这道题是学习栈这个数据结构的经典题, 判断栈的出栈序列是否正确, 既然是判断栈的出栈,那么与栈这个数据结构也是脱离不了干系的
2. 算法原理
3. 代码
java
public boolean validateStackSequences(int[] pushed, int[] popped) {
Stack<Integer> stack = new Stack<>();
int j = 0;
for (int i = 0; i < pushed.length; i++) {
stack.push(pushed[i]);
while (!stack.isEmpty() && stack.peek() == popped[j]) {
stack.pop();
j++;
}
}
return stack.isEmpty();
}









