力扣解题思路:316. 去除重复字母

这篇博客探讨了解决LeetCode中的316题,即如何在保持字符顺序的同时去除字符串中的重复字母。通过分析问题,作者提出使用栈来解决,详细解释了算法思路,包括首次尝试的错误以及最终正确的解决方案,涉及栈的使用和布尔数组记录字符状态的过程。
摘要由CSDN通过智能技术生成

316. 去除重复字母

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

输入:s = "cbacdcbc"
输出:"acdb"

首先分析,要在保证顺序的前提下还要排序,第一个想到的就是优先队列,但是很快被我排除了,因为排序不仅仅只是单纯的字符排序,重点仍然是要保持顺序,所以应该使用栈。

我们先用一个数组记录每个字符出现的顺序,因为只有出现多次的字符才需要判断一下保留哪一个。然后将字符依次入栈,入栈前,需要与前一个字符,也就是栈顶字符相比较,也就是说,如果栈顶字符是多次出现的字符且其大于当前字符,那么可以肯定的是:对于这个重复字符,我们应该选择排在后面,因此栈顶出栈。

按照这个思路可以写出第一个版本:

public String removeDuplicateLetters(String s) {
   
    int[] visited = new int[26];
    for(int i=0;i<s.length();i++){
   
        visited[s.charAt(i)-'a']++;
    }
    Stack<Character> stack = new Stack<>();
    for(int i=0;i<s.length();i++){
   
        char ch = s.charAt(i);
        //visited[ch-'a']--;
        while(!stack.isEmpty() && visited[stack.peek()-'a'] > 0 && ch < stack.peek()){
   
            visited[stack.peek()-'a&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值