这个题真算是打死我了,自己打了个发现算法错了
看了一些别人的博客,尝试去做了,还是不对,后面啊看到https://leetcode.com/discuss/73777/easy-to-understand-iterative-java-solution
的解答。。。
总体来说就是个思想:找到一个字母,使(他的所有左边的字母)构成的字符串 所含的字母全部都能被(它自己加上她右边)这样一个字符串 包括 ,找到第一个这样的字母
这样我们只需要在这个字母的左边找到 一个字典序最小的字母 并把它加到 string res中去, 然后从这个位置+1的位置 往后继续进行以上操作,已经添加到res中的字母就不用考虑了 才用递归算法 然后就可以得到结果
上面链接的楼主的解法中 找到所有的字母出现的最后一个位置 然后找到最先的那个 就是想找到 上面的这个字母然后进行操作 //这个很重要
贴出代码
class Solution {
public:
string removeDuplicateLetters(string s) {
if(s.size()==1||s.size()==0)
return s;
unordered_map<char,int> end;
for(int i=(int)s.size()-1;i>=0;i--)
if(end[s[i]]==0)
end[s[i]]=i;
int start=0;
map<int,char> k;
for(auto n:end)
k[n.second]=n.first;
string res;
for(auto n:k)
{
int back=n.first;
char c=125;
int position=-1;
for(int i=start;i<=back;i++)
{
if(s[i]<c)
{
c=s[i];
position=i;
}
}
if(c>='a'&&c<='z')
{
res+=c;
string k;
for(int j=position+1;j<=s.size()-1;j++)
if(s[j]!=c)
k+=s[j];
return res+ removeDuplicateLetters(k);
}
}
return res;
}
};