题目 <https://leetcode-cn.com/problems/remove-duplicate-letters/>
以cbacdcbc举例,cbacd=>bacd,之后到了c,那么bacd的c要保持原位还是放到最后(保持相对位置不变)呢??
有三种情况
情况1:bac[d],c之后的[d]中存在比c小的字符(无论之后会不会再出现)
情况2:bac[d],c之后的[d]中存在比c大的且之后都不会出现的字符
情况3:bac[d],c之后的[d]中都是比c大的字符
请出现情况1和情况2的时候
当(情况1)在(情况2)的位置前,那么c可以放到最后,例如badb ==> adb
当(情况1)在(情况2)的位置后,那么c保持原位,例如bdab ==> bda
当(情况3),那么c保持原位,字典序最小,不需要调整
char * removeDuplicateLetters(char * s){
char *S = malloc(sizeof(char) * 27);
memset(S,0,sizeof(char) * 27);
int S_len = 0;
int count[128] = {0};
char *p = s;
while(*p != '\0'){
count[*p]++;
p++;
}
p = s;
int i,j,k;
while(*p != '\0'){
for(i=0;i<S_len;i++){
if(S[i] == *p)
break;
}
if(i == S_len){//没有在S里
S[i] = *p;
S_len++;
}else{
for(j=i+1;j<S_len;j++){
if(S[j]<*p || count[S[j]] == 0){//后面还有比他小
break;
}
}
//badb => adb
//bdab => bda
if(j<S_len&&S[j]<*p){
for(k=i;j<S_len;j++){
S[k++] = S[j];
}
S[k++] = *p;
S_len = k;
}
}
count[*p]--;
p++;
}
return S;
}