c_cpp 动态规划 - 最长回文子串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 动态规划 - 最长回文子串相关的知识,希望对你有一定的参考价值。

/*
    最长回文子串 
*/

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>

#define maxn 1010
char S[maxn];
int dp[maxn][maxn];                 

int main() {
    gets(S);                        // 输入整行字符 
    int len=strlen(S), ans=1;        // ans 记录最长回文子串长度 
    int i, j, L;        
    // 边界 
    for(i=0; i<len; ++i) {            
        dp[i][i] = 1;
        if(i < len-1) {
            if(S[i] == S[i+1]) {
                dp[i][i+1] = 1;
                ans = 2;
            }
        }
    }
    // 状态转移方程 
    for(L=3; L<=len; ++L) {            // 枚举子串长度 
        for(i=0; i+L-1 < len; ++i) {    // 枚举子串的起始节点 
            j = i+L-1;                // 子串的右端结点 
            if(S[i]==S[j] && dp[i+1][j-1]==1) {
                dp[i][j] = 1;
                ans = L;            // 更新最长回文子串长度 
            }
        }
    }
    printf("%d\n", ans);            // 输出 

    return 0;
}

以上是关于c_cpp 动态规划 - 最长回文子串的主要内容,如果未能解决你的问题,请参考以下文章

字符串最长回文子串 ( 动态规划算法 ) ★

数据结构与算法动态规划——最长回文子串

动态规划——最长回文子串

[动态规划]最长回文子串

leetcode-5 最长回文子串(动态规划)

[动态规划]最长回文子串-对于动态转移循环顺序的思考