Leecode 0316. 去除重复字母
316. 去除重复字母
给你一个字符串 s
,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
1 | 输入:s = "bcabc" |
示例 2:
1 | 输入:s = "cbacdcbc" |
核心思路是单调栈 + 贪心算法,通过维护一个单调递增的栈来确保字典序最小,同时利用计数数组判断字符是否还有剩余,确保每个字符只保留一次:
- 预处理:
- 统计字符串中每个字符的出现次数(
count
数组); - 记录字符是否已在栈中(
in_stack
数组),避免重复添加。
- 统计字符串中每个字符的出现次数(
- 单调栈逻辑:
- 遍历字符串中的每个字符C:
- 减少
count[c]
(当前字符已被考虑); - 若
c
已在栈中,直接跳过; - 若
c
不在栈中,且栈不为空,且栈顶字符大于c
,且栈顶字符在后续还有出现(count[栈顶字符] > 0
),则弹出栈顶字符(确保字典序更小); - 将
c
压入栈,并标记为已在栈中。
- 减少
- 遍历字符串中的每个字符C:
- 结果构建:
- 栈中字符即为去重后字典序最小的结果,拼接后返回。
代码实现
1 | class Solution { |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.