最主要的还是想好贪心算法怎么定义。
class Solution {
public:
bool judge(int i, vector<vector<int>>& cnt, int& min){
int flag = 0;
vector<int> indexes = cnt[i];
for(int i=0;i<indexes.size();i++){
if (indexes[i]>=min){
min = indexes[i];
flag = 1;
break;
}
}
if (flag == 0){
return false;
}
//min <= possible cnt max
for(int j=0;j<26;j++){
if (j!=i&&cnt[j].size()!=0){
if (cnt[j][cnt[j].size()-1]>=min){
continue;
}
else{
return false;
}
}
}
return true;
}
string removeDuplicateLetters(string s) {
vector<int> temp;
vector<vector<int>> cnt(26, temp);
for (int i=0;i<s.size();i++){
cnt[int(s[i]-'a')].push_back(i);
}
int min=-1;
string res = "";
while(1){
for(int i=0;i<26;i++){
if (cnt[i].size()>0){
int tempmin = min;
if (judge(i, cnt, tempmin)){
cnt[i].clear();
min = tempmin;
char ch ='a'+i;
res += ch;
break;
}
}
}
int flag = 0;
for (int i=0;i<26;i++){
if (cnt[i].size()>0){
flag = 1;
break;
}
}
if (flag==0){
break;
}
}
return res;
}
};