算法——去除重复字符并使得字典序最小

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

解题思路:利用单调栈的思想,新添加的从末尾添加,弹出比它大的栈顶元素,这样就能保证有序,且字典序最大。不同的是,必须保证原有字母还存在一个,所以,如果栈顶元素是剩下的唯一的一个字母了,那就不能弹出它。
所以,该栈不是严格意义的单调栈。

class Solution {
    public String removeDuplicateLetters(String s) {
        Deque<Character> stack = new LinkedList<>();

        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            // 栈中存在了当前字母,那么就不能再添加进去了
            if(stack.contains(c)) continue;
			// 如果栈顶元素比当前字母大,且后面还会出现该字母,那就弹出它
            while(!stack.isEmpty() && stack.peek() > c && s.indexOf(stack.peek(), i) > 0) stack.pop();
			// 当前字母入栈
            stack.push(c);
        }

        StringBuilder res = new StringBuilder();
		// 将栈中的元素从底部弹出,就是答案了
        while(!stack.isEmpty()) {
            res.append(stack.pollLast());
        }

        return res.toString();
    }
}
原文地址:https://www.cnblogs.com/lippon/p/14165249.html