LeetCode:316 去重重复字母 贪心

题目要求去除字符串中重复的字母,保持字典序最小且不改变原有字符顺序。通过贪心策略,尽可能将较小的字符放在前面。具体实现方法包括维护两个表,分别记录字符重复次数和已选字符,然后从前往后遍历,遇到未选中的字符尝试插入答案,若答案尾部存在更大且有备份的字符,则将其移除并继续尝试插入。
摘要由CSDN通过智能技术生成

题目

给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

示例 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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值