DP求最长回文子串

假设字符串长度为len
最优子结构: dp[1][len-1] =
1 (dp[1+1][len-1-1] == 1)
0 (dp[1+1][len-1-1] == 0)

dp[i][j] = 1 表示 从第i到第j个元素,构成了回文关系
状态转移方程:
dp[i][j] =
1 (dp[i+1][j-1] == 1)
0 (dp[1+1][j-1] == 0)
边界:dp[i][i] = 1, dp[i][i+1] = 1
即所有单一元素,以及连续两个相同的元素,构成了回文

全部代码

#include <stdio.h>
#include <string.h>

const int maxn = 1010 ;
char s[maxn];
int dp[maxn][maxn];

int main(){
    gets(s);
    int len = strlen(s), ans = 1;
    memset(dp, 0, sizeof(dp));
    for( int 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( int L = 3; L <= len; L++){
        for( int i = 0; i + L - 1 < len; i ++){
            int 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;
}

猜你喜欢

转载自blog.csdn.net/Xurui_Luo/article/details/82665839
今日推荐