(自己开发的博客,欢迎访问)https://www.weiboke.online
316. Remove Duplicate Letters
Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.
Example 1:
Input: “bcabc”
Output: “abc”
Example 2:
Input: “cbacdcbc”
Output: “acdb”
Approach
题目大意是要去掉重复字符,保证每个字符只出现一次,并且保证最后的字符串的字典序最小。
最后看讨论区,看到一个不错的思路,用贪心的思想,每次保证在一定范围里(字符都有重复)找到最小的字符,直到某个字符次数不足一次的时候,然后递归剩余字符。
Code
class Solution {
public:
string removeDuplicateLetters(string s) {
vector<int> cnt(26, 0);
for (auto c:s) {
cnt[c - 'a']++;
}
int pos = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] < s[pos])pos = i;
if (!(--cnt[s[i] - '0']))break;
}
if (s.empty())return "";
string buffer = s.substr(pos + 1);
buffer.erase(remove(buffer.begin(), buffer.end(), s[pos]), buffer.end());
return s[pos] + removeDuplicateLetters(buffer);
}
};