题目描述
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入:s = “bcabc”
输出:“abc”
示例 2:
输入:s = “cbacdcbc”
输出:“acdb”
思路分析
- 入栈条件:当前元素字典序大于栈顶,且栈中没有出现过该元素
- 维护一个计数数组和判断栈中是否出现过该元素的数组
- for循环遍历,
当栈中没有出现过该元素的时候,
当前元素小于栈顶元素字典序并且栈顶元素后面还有的时候,栈顶出栈。
入栈,boolean数组置为true - 最后将栈中元素连接返回字符串
代码
public String removeDuplicateLetters(String s) {
int []count = new int[256];
for(int i = 0;i<s.length(); i++) {
count[s.charAt(i)]++;
}
boolean []inStack = new boolean[256];
Deque<Character> stack = new LinkedList<>();
for(int i = 0; i < s.length(); i++) {
char cur = s.charAt(i);
if(!inStack[cur]) {
while(!stack.isEmpty() && cur < stack.peek() && count[stack.peek()] > 0) {
int outChar = stack.pop();
inStack[outChar] = false;
}
stack.push(cur);
inStack[cur] = true;
}
count[cur]--;
}
StringBuilder res = new StringBuilder();
for(char ch : stack) {
res.append(ch);
}
return res.reverse().toString();
}