思路分析
- 遍历字符串每个字符:
- 遇到非星号字符:压入栈中(暂存待保留的字符);
- 遇到星号:弹出栈顶元素(即左侧最近的非星号字符),同时星号自身不压栈(等价于删除星号);
- 拼接栈内剩余字符:栈中保留的就是删除所有星号后的结果,按顺序拼接即可。
代码实现
java
/**
* 借助栈实现
**/
public String removeStars(String str) {
// 遍历字符串,做入栈操作,如果为 * 切栈不为空,则做出栈操作
Deque<Character> stack = new ArrayDeque<>();
for (int i = 0; i < str.length(); i++) {
char charAt = str.charAt(i);
// 若不是 * ,则入栈
if (charAt != '*'){
stack.push(charAt);
} else{
// 如果是 * ,则出栈
if (!stack.isEmpty()){
stack.pop();
}
}
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()){
sb.append(stack.pop());
}
return sb.reverse().toString();
}
/**
- 使用字符串模拟栈
**/
java
public String removeStars2(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char charAt = str.charAt(i);
// 如果不是*,则入栈
if (charAt != '*'){
sb.append(charAt);
} else{
if (sb.length() > 0){
sb.deleteCharAt(sb.length() - 1);
}
}
}
return sb.toString();
}
复杂度分析
- 时间复杂度:O(n) → 遍历字符串 n 个字符(每个字符仅处理 1 次),拼接结果也是 O (n);
- 空间复杂度:O(n) → 最坏情况无星号,栈 / StringBuilder 存储所有 n 个字符。