题目
给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入: “bcabc”
输出: “abc”
示例 2:
输入: “cbacdcbc”
输出: “acdb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicate-letters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
我们想得到最小的字典序,那么就应该尽量把小的字符放在前面,但是这题还要维护字符相对位置的不变,情况就有点难了
这题贪心的点就是:小的字符尽量往前放
- 维护一张表
cnt
,记录当前情况,每个字符重复的次数(即后面还有多少个可用的备份) - 维护一张表
vis
,记录当前答案中已经被选择的字符 - 维护一个字符串,记录答案
遍历字符串,开始进行表的维护,当前访问的字符是 c
- 如果答案中有
c
了,那么跳过,并且后面可用的c
字符个数-1 - 如果答案中没有c,尝试将c从尾部插入答案,不断弹出【位于答案尾部,大于c,且后面还有可用备份】的字符,直到遇到比c小的,或者后面实在没有可用字符了,就停止
- 弹出结束后,插入字符
c
,同时c
的可用备份数目-1
贪心的点,其实就是尽量把小的字符放到前面,想要放一个字符c,如果答案结尾字符比c大,且后面还有出现,那么就可以删除结尾字符,放入c,尽量保证前面的都是小的字符
代码
class Solution {
public:
string removeDuplicateLetters(string s)
{
if(s.