letcode每日一题-去除重复字母

题目的letcode连接:https://leetcode-cn.com/problems/remove-duplicate-letters/
题目描述如下:

思路:
运用: 贪心 - 用栈
用栈来存储最终返回的字符串,并维持字符串的最小字典序。每遇到一个字符,如果这个字符不存在于栈中,就需
要将该字符压入栈中。但在压入之前,需要先将之后还会出现,并且字典序比当前字符小的栈顶字符移除,然后再将当
前字符压入。
代码实现如下:


public String removeDuplicateLetters(String s) {
        HashMap<Character,Integer> last_occurrence =new HashMap<>();
        Stack<Character> no_repeat_list=new Stack<>();
        for(int i=0;i<s.length();i++){
            last_occurrence.put(s.charAt(i),i);
        }
        HashSet<Character> seen = new HashSet<>();
        for(int i=0;i<s.length();i++){
            if(!seen.contains(s.charAt(i))){
                //在压入之前,需要先将之后还会出现,并且字典序比当前字符小的栈顶字符移除,然后再将当前字符压入。
                while(!no_repeat_list.isEmpty() && s.charAt(i) < no_repeat_list.peek() && last_occurrence.get(no_repeat_list.peek()) > i){
                    seen.remove(no_repeat_list.pop());
                }
                seen.add(s.charAt(i));
                no_repeat_list.push(s.charAt(i));
            }
        }
        StringBuilder result=new StringBuilder();
        for (Character tmp:no_repeat_list){
            result.append(tmp);
        }
        return result.toString();
    }

原文地址:https://www.cnblogs.com/MissWX/p/14078420.html