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:
Given "bcabc"
Return "abc"
Given "cbacdcbc"
Return "acdb"
这个题很有意思。
1、首先chars[]保存每个字符最后出现的位置。
2、找chars[]里的最小值,获得这个位置pos。
3、从[start, pos]中搜索最小的字符,加入ret。start = 这个字符位置+1。
4、chars[这个字符] = -1;因为一个字符只要一次。
5、重复2-4
class Solution {
public:
string removeDuplicateLetters(string s)
{
string ret = "";
vector<int> chars(26, -1);
for (int i = 0; i < s.size(); i++)
chars[s[i] - 'a'] = i;
start = 0;
while (1)
{
int pos = findminpos(chars);
if (pos == -1) break;
char c = findminchar(pos, s, chars);
ret = ret + c;
chars[c - 'a'] = -1;
}
return ret;
}
private:
int start;
int findminpos(vector<int>& chars)
{
int ret = INT_MAX;
for (auto it : chars)
{
if (it != -1)
ret = min(ret, it);
}
return (ret == INT_MAX) ? -1 : ret;
}
char findminchar(int pos, string& s, vector<int>& chars)
{
char ret = 'z';
for (int i = start; i <= pos; i++)
{
if (chars[s[i] - 'a'] != -1 && s[i] < ret)
{
ret = s[i];
start = i + 1;
}
}
return ret;
}
};
本文介绍了一个算法问题:如何从一个只包含小写字母的字符串中移除重复的字母,确保每个字母只出现一次,并且结果字符串在字典序上是最小的。通过记录每个字符最后一次出现的位置,并使用迭代的方法找到最小的字符加入结果字符串。
1705

被折叠的 条评论
为什么被折叠?



