考察点:递归,C++字符串操作,贪心;
思路:每一次递归,首先用贪心法找到left_most位置的字符,就是找到字母数尽可能最小的位置(‘a’的话最好),遇到只有一个字母的位置时停下扫描,break;然后将s的left_most位置之前的字符删掉,后面重复的字符也删掉,最后返回空字符或者left_most位置的字符加下一个递归的结果。
C++代码:
class Solution {
public:
string removeDuplicateLetters(string s) {
vector<int> count = vector<int>(26, 0);
for (int i=0; i<s.size(); i++) {
count[s[i] - 'a']++;
}
int pos = 0;
for (int i=0; i<s.size(); i++) {
if (s[pos] > s[i])
pos = i;
if ((--count[s[i] - 'a']) == 0)
break;
}
int index = 1;
while ((index=s.find(s[pos], pos+1)) != string::npos) {
s.replace(index, 1, "");
}
return s=="" ? s : s[pos] + removeDuplicateLetters(s.substr(pos+1));
}
};