有点奇怪的一道题 题意是将字符串s内出现的每种字母只保留一个 并要求字典序最小
有点类似优先队列的思想,遍历s的同时维护一个结果串ans,当出现未访问过的字符c时,从后往前查看结果串的字符,如果结果串ans当前的字符cc,满足cc>c 并且原串s后面还会出现cc,就把cc删除。从后往前删除所有这样的cc后,把c添加到ans的末尾。
最后ans就是答案
class Solution {
public String removeDuplicateLetters(String s) {
int []num = new int[26];
int []vis = new int[26];
StringBuffer ans = new StringBuffer("");
for(int i=0;i<s.length();i++){
num[s.charAt(i)-'a']++;
}
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
if(ans.equals("")){
ans.append(c);
num[c-'a']--;
vis[c-'a']=1;
continue;
}
if(vis[c-'a']==1){
num[c-'a']--;
continue;
}
int j=ans.length()-1;
while(j>=0){
char cc = ans.charAt(j);
if(cc<c || num[cc-'a']==0)
break;
vis[cc-'a']=0;
ans.deleteCharAt(ans.length()-1);
j--;
}
ans.append(c);
vis[c-'a']=1;
num[c-'a']--;
}
return ans.toString();
}
}