力扣-从字符串中移除星号

思路分析

  1. 遍历字符串每个字符:
    • 遇到非星号字符:压入栈中(暂存待保留的字符);
    • 遇到星号:弹出栈顶元素(即左侧最近的非星号字符),同时星号自身不压栈(等价于删除星号);
  2. 拼接栈内剩余字符:栈中保留的就是删除所有星号后的结果,按顺序拼接即可。

代码实现

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 个字符。
相关推荐
海砥装备HardAus几秒前
飞控算法中双环串级PID深度解析:角度环与角速度环的协同机制
stm32·算法·无人机·飞控·串级pid
宵时待雨1 分钟前
优选算法专题1:双指针
数据结构·c++·笔记·算法·leetcode
zsc_1183 分钟前
pvz3解码小游戏求解算法
算法
汀、人工智能5 分钟前
[特殊字符] 第107课:LRU缓存(最后一课[特殊字符])
数据结构·算法·链表·数据库架构·哈希表·lru缓存
Stella Blog7 分钟前
狂神Java基础学习笔记Day01
java·笔记·学习
李白的天不白8 分钟前
java处理跨域请求
java
数据知道10 分钟前
claw-code 源码分析:结构化输出与重试——`structured_output` 一类开关如何改变「可解析性」与失败语义?
算法·ai·claude code·claw code
tankeven11 分钟前
HJ172 小红的矩阵染色
c++·算法
云烟成雨TD13 分钟前
Spring AI Alibaba 1.x 系列【11】Spring AI Models 扩展:DashScope
java·人工智能·spring
小堃学编程14 分钟前
【项目实战】基于protobuf的发布订阅式消息队列(2)—— 线程池
java·开发语言