Day 10:100322. 删除星号以后字典序最小的字符串

Leetcode 100322. 删除星号以后字典序最小的字符串

给你一个字符串 s 。它可能包含任意数量的 '' 字符。你的任务是删除所有的 ' ' 字符。

当字符串还存在至少一个 '*' 字符时,你可以执行以下操作:

  • 删除最左边的 '*' 字符,同时删除该星号字符左边一个字典序 最小 的字符。如果有多个字典序最小的字符,你可以删除它们中的任意一个。

请你返回删除所有 '*' 字符以后,剩余字符连接而成的 字典序最小 的字符串。

删除 * 号左边一个字典序最小的字符,有多个,删除一个,虽是如此,但是还有另一个要求,剩余字符串连接而成的字典序最小,因此要删除离 * 号最近的一个字典序最小的字符。

用一个 26 维的数组保存每个字母出现的位置,遇到星号,查找字典序最小的字符的索引。

但是不能直接删除,如果直接删除会影响保存的索引,因此用一个数组先保存删除的索引,之后从后往前删除。

完整代码

java 复制代码
class Solution {
    public String clearStars(String s) {
        StringBuilder builder = new StringBuilder(s);
        List<Integer>[] chars = new List[26];
        List<Integer> delete = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            chars[i] = new ArrayList<>();
        }

        for (int i = 0; i < builder.length(); i++) {
            if (builder.charAt(i) == '*') {
                delete.add(i);
                for (int j = 0; j < 26; j++) {
                    int size = chars[j].size();
                    if (size > 0) {
                        int num = chars[j].get(size - 1);
                        chars[j].remove(size - 1);
                        delete.add(num);
                        break;
                    }
                }
            } else {
                chars[builder.charAt(i) - 'a'].add(i);
            }
        }
        Collections.sort(delete);
        for (int i = delete.size() - 1; i >= 0; i--) {
            builder.deleteCharAt(delete.get(i));
        }
        return String.valueOf(builder);
    }
}
相关推荐
熊出没1 分钟前
CommitLoom 使用教程:在 IntelliJ IDEA 中自动生成 Git 提交信息
java·git·intellij-idea
海绵宝宝转agent3 分钟前
2026-10-21学习笔记
笔记·学习·算法
Dxy123931021614 分钟前
ShardingSphere 自定义分片算法:BINARY(16) UUIDv7 哈希分片实现
算法·哈希算法
步行cgn19 分钟前
Spring MVC POST 请求乱码:原因与完整解决方案
java·spring·mvc
y1su21 分钟前
Leetcode 链表,树,回溯 模板
java·leetcode·链表
qianyuqiye125 分钟前
K8s 命名空间与 Pod 入门:从概念到实战
java·docker·kubernetes
牧瀬クリスだ33 分钟前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式
小张成长计划..37 分钟前
【Linux】26:线程互斥和同步
java·开发语言
邪修king3 小时前
Re:Linux 系统篇(三十五):进程间通信Chapter2:从匿名管道到进程池:Linux 进程间通信实战(深度理解「先描述,再组织」)
java·linux·运维
拆房老料4 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt