题目
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”
题解
每一次找没找过的字母所能最先出现的字母
也就是该字母位置后面还有所需要的所有字母,那么该位置之前的都可以删除
代码
class Solution {
public:
bool mark[30];
string ss;
string gao( int st ){
int cnt[30];
memset( cnt, 0, sizeof( cnt ) );
for( int i = st; i < (int)ss.size(); i++ ){
if( mark[ss[i]-'a'] ) continue;
cnt[ss[i]-'a']++;
}
int pos = st;
while( mark[ss[pos]-'a'] && pos < (int)ss.size() ) pos++;
for( int i = pos; i < (int)ss.size(); i++ ){
if( mark[ss[i]-'a'] ) continue;
if( ss[i] < ss[pos] ) pos = i;
if( --cnt[ss[i]-'a'] == 0 ) break;
}
if( pos >= (int)ss.size() ){
return "";
}else{
mark[ss[pos]-'a'] = true;
return ss[pos] + gao( pos + 1 );
}
}
string removeDuplicateLetters(string s) {
ss = s;
memset( mark, false, sizeof( mark ) );
return gao( 0 );
}
};