【单调栈】 316. 去除重复字母

本文介绍了一种高效的算法,用于去除给定字符串s中的重复字母,确保输出的字典序最小。通过维护计数数组和判断栈,遵循特定入栈规则,实现了不改变字符相对位置的去重操作。代码展示了如何在Java中实现这一过程。
摘要由CSDN通过智能技术生成
题目描述

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

示例 1:
输入:s = “bcabc”
输出:“abc”
示例 2:
输入:s = “cbacdcbc”
输出:“acdb”

思路分析
  1. 入栈条件:当前元素字典序大于栈顶,且栈中没有出现过该元素
  2. 维护一个计数数组和判断栈中是否出现过该元素的数组
  3. for循环遍历,
    当栈中没有出现过该元素的时候,
    当前元素小于栈顶元素字典序并且栈顶元素后面还有的时候,栈顶出栈。
    入栈,boolean数组置为true
  4. 最后将栈中元素连接返回字符串
代码
public String removeDuplicateLetters(String s) {
        int []count = new int[256];
        for(int i = 0;i<s.length(); i++) {
            count[s.charAt(i)]++;
        }
        boolean []inStack = new boolean[256];
        Deque<Character> stack = new LinkedList<>();
        for(int i = 0; i < s.length(); i++) {
            char cur = s.charAt(i);
            if(!inStack[cur]) {
                while(!stack.isEmpty() && cur < stack.peek() && count[stack.peek()] > 0) {
                    int outChar = stack.pop();
                    inStack[outChar] = false;
                }
                stack.push(cur);
                inStack[cur] = true;
            }
            count[cur]--;
        }
        StringBuilder res = new StringBuilder();
        for(char ch : stack) {
            res.append(ch);
        }
        return res.reverse().toString();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值