316. 去除重复字母
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同
示例 1:
输入:s = "bcabc"
输出:"abc"
示例 2:
输入:s = "cbacdcbc"
输出:"acdb"
提示:
1 <= s.length <= 104
s 由小写英文字母组成
class Solution {
public String removeDuplicateLetters(String s) {
boolean[] flag = new boolean[26];
int[] counts = new int[26];
//统计字母出现的次数
for(char c:s.toCharArray()){
counts[c-'a']++;
}
Stack<Character> stack = new Stack<>();
for(char c:s.toCharArray()){
if(!flag[c-'a']){
while(!stack.empty()&&stack.peek()>c){//栈不为空且栈顶的元素字典序大于当前元素
if(counts[stack.peek()-'a']>0){
flag[stack.peek()-'a'] = false;
stack.pop();
}else{
break;
}
}
stack.push(c);
flag[c-'a']=true;
}
counts[c-'a']--;
}
char chars[]=new char[stack.size()];
for (int i = 0; i < stack.size(); i++) {
chars[i]=stack.get(i);
}
return new String(chars);
}
}
在使用的过程中,由于Stack不能直接转换成String,所以感觉还是用StringBuffer/StringBuilder更好一些
思路参考:
https://leetcode-cn.com/problems/remove-duplicate-letters/solution/yi-zhao-chi-bian-li-kou-si-dao-ti-ma-ma-zai-ye-b-4/