Leetcode 去除重复字母

在这里插入图片描述


✅ 关键点

  1. count[] 表示的是“剩余出现次数”,在遍历每个字符时都要执行 count[c - 'a']--;,这是必须的步骤,不管该字符是否已经在栈中;

  2. 使用**单调栈(递增的字典序)**维护当前已选字符构成的“局部最优子结果”,最终逆序输出即可得到全局最优结果;

  3. 如果当前字符 不在栈中,那么就尝试把它加入栈;

    • 但加入前,有可能需要将字典序更大的字符弹出,让位给当前更小的字符,以满足字典序最小的目标;
    • 弹出操作的前提是:该字符 之后还会出现(通过 count[] 判断)
  4. 弹出时要记得将 inStack[] 标记为 false,加入时则标记为 true,以确保每个字符在栈中只出现一次。


✅ 可以这样总结这个“让位逻辑”:

当前字符要想成功“插队”,它必须比栈顶更小,而且栈顶字符不能是“最后一次机会”,这样才有资格被踢出。


✍️ 补充一句更直观的通俗解释:

你可以把这个过程类比为“最小字典序的选秀”:

  • 每个字符都想进最终的结果队伍(栈);
  • 如果一个新的候选人(当前字符)进来,发现他更“优秀”(字典序更小);
  • 那就要判断当前队伍里的末尾成员是否可以被替换掉:
    • 如果末尾成员 还会在之后出现,就可以被替换;
    • 否则就必须留下他(他已经是唯一一次出现了);
  • 最终构建出的是一支去重后最强(字典序最小)的队伍

java solution

class Solution {
   
   
    public String removeDuplicateLetters(String s) {
   
   
        //首先需要统计每个字符剩余出现次数
        <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值