首页 > 试题广场 >

添加最少的字符让字符串变为回文字符串(1)

[编程题]添加最少的字符让字符串变为回文字符串(1)
  • 热度指数:1861 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个字符串str,如果可以在str的任意位置添加字符,请返回在添加字符最少的情况下,让str整体都是回文字符串的一种结果。

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


输出描述:
输出一行,代表返回的字符串。
示例1

输入

ABA

输出

ABA
示例2

输入

AB

输出

ABA

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

#define MAXLEN 5001
#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))

int **getDP(char *str, int len);

void freeDP(int **dp, int len);

char *getPalStr(char *str, int len, int **dp);

int main(void) {
    int len, **dp;
    char str[MAXLEN], *res;
    scanf("%s", str);
    len = strlen(str);
    dp = getDP(str, len);
    res = getPalStr(str, len, dp);
    printf("%s\n", res);
    free(res);
    freeDP(dp, len);
    return 0;
}

int **getDP(char *str, int len) {
    int **dp = (int **) malloc(sizeof(int *) * len);
    for (int i = len - 1; i >= 0; i--) {
        dp[i] = (int *) malloc(sizeof(int) * len);
        dp[i][i] = 0;
        for (int j = i + 1; j < len; j++) {
            if (str[i] == str[j]) {
                dp[i][j] = j - i < 2 ? 0 : dp[i + 1][j - 1];
            } else {
                dp[i][j] = j - i < 2 ?
                    1 : (MIN(dp[i + 1][j], dp[i][j - 1]) + 1);
            }
        }
    }
    return dp;
}

void freeDP(int **dp, int len) {
    for (int i = 0; i < len; i++) {
        free(dp[i]);
    }
    free(dp);
}

char *getPalStr(char *str, int len, int **dp) {
    char *res = (char *) malloc(len + dp[0][len - 1] + 1);
    res[len + dp[0][len - 1]] = '\0';
    int l = 0, r = len + dp[0][len - 1] - 1;
    int i = 0, j = len - 1;
    while (i <= j) {
        if (str[i] == str[j]) {
            res[l++] = str[i++];
            res[r--] = str[j--];
            continue;
        }
        if (dp[i + 1][j] < dp[i][j - 1]) {
            res[l++] = str[i];
            res[r--] = str[i++];
        } else {
            res[l++] = str[j];
            res[r--] = str[j--];
        }
    }
    return res;
}

发表于 2022-02-09 13:48:32 回复(0)

问题信息

上传者:小小
难度:
3条回答 6945浏览

热门推荐

通过挑战的用户

查看代码