思路如下;
需要一个数组count记录s中每个元素出现的个数,一个数组visited记录是否被访问过,和一个栈来存放最后的结果。当便利s时判断是不是比栈顶的元素小,栈顶元素是不是的后面还有,如果满足且则栈顶元素出栈,该元素进栈。
程序如下
class Solution {
public:
string removeDuplicateLetters(string s) {
int count[26]={0};
stack<char> al;
string final="";
for(int i=0;i<s.size();i++)
count[s[i]-'a']++;
bool visited[26]={false};
for(int i=0;i<s.size();i++){
count[s[i]-'a']--;
if(visited[s[i]-'a']) continue;
else{
while(!al.empty()&&al.top()>s[i]&&count[al.top()-'a']){
visited[al.top()-'a']=false;
al.pop();
}
al.push(s[i]);
visited[s[i]-'a']=true;
}
}
while(!al.empty()){
final=al.top()+final;
al.pop();
}
return final;
}
};