给你一个字符串 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();
}
}