题意:给出一个有重复字符的字符串,求出去掉重复字符后字典序最小的字符串。
思路:贪心。当一个字符在它以后的位置都不会再出现时,那么我们取这个字符之前所有字符的最小值,然后递归的求从最小值所在位置向后的子串即可。注意这个字串中要去掉之前的最小值。
class Solution {
public:
string removeDuplicateLetters(string s) {
if (s.length() == 0) return s;
string ans;
int cnt[30] = {0};
int len = s.length();
for (int i = 0; i < len; i++)
cnt[s[i]-'a']++;
char minVal = 'z' + 1;
int minPos;
for (int i = 0; i < len; i++) {
if (minVal > s[i]) {
minVal = s[i];
minPos = i;
}
if (--cnt[s[i]-'a'] == 0)
return minVal + removeDuplicateLetters(delet(s.substr(minPos+1), minVal));
}
}
string delet(string s, char c) {
string ans;
for (int i = 0; i < s.length(); i++) {
if (s[i] != c)
ans += s[i];
}
return ans;
}
};