首页 > 试题广场 >

删除多余的字符得到字典序最小的字符串

[编程题]删除多余的字符得到字典序最小的字符串
  • 热度指数:1762 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给一个全是小写字母的字符串str,删除多余字符,使得每种字符只保留一个,并且让最终结果字符串字典序最小。

输入描述:
输入包含一行字符串,代表str


输出描述:
输出一行,代表删除后的字符串。
示例1

输入

acbc

输出

abc
示例2

输入

dbcacbca

输出

dabc

备注:
时间复杂度,额外空间复杂度
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLEN 100001

char *removeDuplicateLetter(char *str) {
    int map[26], len = (int) strlen(str);
    char *res = (char *) malloc(len + 1);
    memset(map, 0, sizeof(int) * 26);
    for (int i = 0; i < len; i++) {
        map[str[i] - 'a']++;
    }
    int l = 0, r = 0, index = 0;
    while (r < len) {
        if (map[str[r] - 'a'] == -1 ||
            --map[str[r] - 'a'] > 0) {
            r++;
            continue;
        }
        int pick = -1;
        for (int i = l; i <= r; i++) {
            if (map[str[i] - 'a'] != -1 &&
                (pick == -1 || str[i] < str[pick]))
                pick = i;
        }
        res[index++] = str[pick];
        for (int i = pick + 1; i <= r; i++) {
            if (map[str[i] - 'a'] != -1)
                map[str[i] - 'a']++;
        }
        map[str[pick] - 'a'] = -1;
        l = pick + 1;
        r = l;
    }
    res[index] = '\0';
    return res;
}

int main(void) {
    char str[MAXLEN], *res;
    scanf("%s", str);
    res = removeDuplicateLetter(str);
    printf("%s", res);
    free(res);
    return 0;
}

发表于 2022-02-08 17:44:59 回复(0)