美文网首页
数据结构与算法-去除重复字符串,保持字典序最小

数据结构与算法-去除重复字符串,保持字典序最小

作者: 恍然如梦_b700 | 来源:发表于2020-04-21 23:17 被阅读0次

题目: 去除重复字母(LeetCode-困难)

给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)
示例1:
输入:"bcabc"
输出:"abc"

示例2:
输入:"cbacdcbc"
输出:"acdb"

字典序:

字符串之间比较和数字比较不一样; 字符串比较是从头往后挨个字符比较,那个字符串大取决于两个字符串中第一个对应不相等的字符; 例如 任意一个a开头的字符串都大于任意一个b开头的字符串;例如字典中apple 大于 book;
题目的意思,你去除重复字母后,需要按最小的字典序返回.并且不能打乱其他字母的相对位置;
例如 bcabc 你应该返回abc, 而不是bca,cab;
例如 cbacdcbc 应该返回acdb,而不是cbad,bacd,adcb
例如 zab,应该返回zab,而不是abz;

算法思想:

1.判断字符串可能出现的特殊情况
2.用一个record数组记录字符出现次数
3.申请一个字符串栈stack来处理数据,
4.遍历字符串
5.从0~top遍历stack,判断当前字符S[i]是否在栈中存在isExist
6.如果存在,record[S[i]]--,并且继续循环遍历下一个字符(说明当前字符已经存到栈中了,不用继续存)
7.若不存在,需要找到正确的位置存储,也就是要保持栈是递减的
循环:若栈顶元素比当前字符大并且记录大于1,将栈顶元素出栈,直到不满足条件将当前字符入栈。
top > -1表示栈非空
stack[top] > s[i]表示栈顶元素比当前元素大
record[stack[top]] > 1表示后面还会出现
8.遍历完所有字符,则在stack后面添加结束符'\0',并返回stack的首地址

char *removeDuplicateLetters(char *s) {
    //简单判断特出情况
    if (s == NULL || strlen(s) == 0) {
        return "";
    }
    if (strlen(s) == 1) {
        return s;
    }
    
    int record[26] = {0};
    int len = (int)strlen(s);
    for (int i=0; i<len; i++) {
        record[s[i]-'a']++;
    }
     //申请一个字符串stack;(用栈的特性来进行stack字符串的数据进出,并不一定非要创建一个栈)
    char *stack = (char *)malloc(sizeof(char)*(len+1));
     //memset(void *s, int ch, size_t n) 将stack len*2*sizeof(char)长度范围的空间填充0;
    memset(stack, 0, strlen(stack));
    int top = -1;
    for (int i=0; i<len; i++) {
        int isExist = 0;
        for (int j=0; j<=top; j++) {
            if (s[i] == stack[j]) {
                isExist = 1;
                break;
            }
        }
        if (isExist) {
            record[s[i]-'a']--;
        } else {
            while (top>-1 && stack[top]>s[i] && record[s[i]]>0) {
                top--;
            }
            stack[++top] = s[i];
        }
    }
    
    stack[++top] = '\0';
    
    return stack;
}
int main(int argc, const char * argv[]) {
    // insert code here...
    char *s ;
    s = removeDuplicateLetters("cbacdcbc");
    printf("%s\n",s);
    return 0;
}

相关文章

网友评论

      本文标题:数据结构与算法-去除重复字符串,保持字典序最小

      本文链接:https://www.haomeiwen.com/subject/jwhvihtx.html