问题描述
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入:s = "bcabc"
输出:"abc"
示例 2:输入:s = "cbacdcbc"
输出:"acdb"
提示:
1 <= s.length <= 104
s 由小写英文字母组成来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-duplicate-letters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Java
class Solution {
public String removeDuplicateLetters(String s) {
char[] arr = s.toCharArray();
int len = arr.length;
int[] position = new int[26];
//记录每个字符最后出现的位置
for(int i = 0;i < len;i++){
position[arr[i] - 'a'] = i;
}
//记录字符不能重复
boolean[] visible = new boolean[26];
//存储结果集
Stack<Character> stack = new Stack<>();
for(int i = 0;i < len;i++){
char cur = arr[i];
if(visible[cur - 'a']) continue;
//栈不为空
//结果要保证字典序最小,当前字符小于栈顶的字符并且栈顶字符在后面还会出现,那就将他弹出
while(!stack.isEmpty() && cur < stack.peek() && position[stack.peek() - 'a'] > i){
char pop = stack.pop();
visible[pop - 'a'] = false;
}
stack.push(cur);
visible[cur - 'a'] = true;
}
//需要将结果反转
StringBuilder ans = new StringBuilder();
while(!stack.isEmpty()){
ans.append(stack.pop());
}
return ans.reverse().toString();
}
}