欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

2024/4/3-力扣-最长回溯子串-解 1:动态编程-回溯子串

最编程 2024-06-30 15:00:43
...
char* longestPalindrome(char *s) {
    int n = strlen(s);
    if (s == NULL || n == 0 || n == 1) {
        return s;
    }
    int dp[n][n];
    memset(dp, 0, sizeof(dp));
    for (int i = n - 1; i >= 0; i--) { // 从下到上
        for (int j = i; j < n; j++) { // 从左到右
            if (s[i] == s[j]) {
                if (j - i <= 1) { // 情况一 和 情况二
                    dp[i][j] = 1;
                } else if (dp[i + 1][j - 1]) { // 情况三
                    dp[i][j] = 1;
                }
            }
        }
    }
    int l = 0, r = 0;
    for (int i = 0; i < n; i++) {
        for (int j = i; j < n; j++) {
            if (dp[i][j] && j - i > r - l) {
                l = i;
                r = j;
            }
        }
    }
    int len = r - l + 1;
    char *res = malloc(sizeof(int) * len);
    int k = 0;
    for (int i = l; i <= r; i++) {
        res[k++] = s[i];
    }
    res[k] = '\0';
    return res;
}