Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.
Example:
Given "bcabc"
Return "abc"
Given "cbacdcbc"
Return "acdb"
The idea is to keep a Monotonous stack
when a letter comes, if it is already in the stack, continue;
if it is not in the stack, we pop out the top element of the stack util the top element is smaller than the letter. (if a letter is in its last occurrence, then we need to break because each letter should exists at least once).
code:
public class Solution {
public String removeDuplicateLetters(String s) {
int[] last = new int[26];
for(int i = 0 ; i < s.length(); i++){
char c = s.charAt(i);
last[c - 'a'] = i;
}
LinkedList<Character> list = new LinkedList<>();
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(list.contains(c)) continue;
while(list.size() > 0 && list.getLast() >= c && last[list.getLast() - 'a'] > i){
list.removeLast();
}
if(!list.contains(c)) list.add(c);
}
StringBuilder ret = new StringBuilder();
for(char c : list){
ret.append(c);
}
return ret.toString();
}
}