LeetCode--去除重复字母(23)

字符串处理:去除重复字母并保持字典序
该博客介绍了一种算法,用于在不改变原有字符顺序的前提下,从给定字符串中移除重复的字母,确保结果字符串的字典序最小。博主通过使用栈数据结构和字典序比较策略实现了这一功能。复杂度分析显示,算法的时间复杂度为O(N),空间复杂度为O(1)。

去除重复字母

题目:给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入:s = "bcabc"
输出:"abc"
思路:1.用栈存储当前遍历元素。
2.如果当前元素未被访问过,则判断其字典序是否小于栈顶元素而且栈顶元素在以后还会出现;
3.如果小于,则弹出当前栈顶,继续进行判断(为了获取字典序最小的序列)
4.如果不满足上述条件,直接将其加入栈中即可
5.最后将栈中字符转换成字符串即可

在这里插入图片描述

复杂度分析
时间复杂度:O(N)。虽然外循环里面还有一个内循环,但内循环的次数受栈中剩余字符总数的限制,因此最终复杂度仍为O(N)。
空间复杂度:O(1)。看上去空间复杂度像是O(N),但这不对!首先, seen 中字符不重复,其大小受字母表大小的限制。其次,只有 stack 中不存在的元素才会被压入,因此 stack 中的元素也唯一。所以最终空间复杂度为O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值