316. 去除重复字母 Remove Duplicate Letters

题目 <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;
}

猜你喜欢

转载自blog.csdn.net/ZRXSLYG/article/details/112695036