class Solution {
public String removeDuplicateLetters(String s) {
// 存储结果的栈
Stack<Character> stack = new Stack<>();
// 记录字符串中字符出现的次数
int[] count = new int[26];
for (int i = 0; i < s.length(); i++) {
count[s.charAt(i) - 'a']++;
}
// 记录字符是否已经存在于结果栈中,默认值为 false
boolean[] inStack = new boolean[26];
for (char c : s.toCharArray()) {
// 当前遍历的字符对应计数 -1
count[c - 'a']--;
if (inStack[c - 'a']) {
// 当前遍历的字符已放入结果栈,跳过
continue;
}
// 剩余的字符串中还存在栈顶字符 且 当前遍历的字符字典序小于栈顶字符
while (!stack.isEmpty() && stack.peek() > c && count[stack.peek() - 'a'] != 0) {
// 弹出栈顶字符并标记为不存在于结果栈中
inStack[stack.pop() - 'a'] = false;
}
stack.push(c);
inStack[c - 'a'] = true;
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
return sb.reverse().toString();
}
}