Loading...

动态规划-最长回文子串

求解代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public int getLongestPalindrome (String A) {
        if(A==null||A.length()==0){
            return 0;
        }

        int n = A.length();
        char[] str = A.toCharArray();

        int max = 1;
        boolean[][] dp = new boolean[n][n];
        for(int i=0;i<n;i++){
            dp[i][i]=true;
        }

        for(int i=1;i<n;i++){
            for(int j=0;j<i;j++){
                if(str[i]!=str[j]){
                    dp[j][i]=false;
                }else{
                    if(i-j<=1){
                        dp[j][i]=true;
                    }else{
                        dp[j][i]=dp[j+1][i-1];
                    }

                    if(dp[j][i]){
                        max=Math.max(max, i-j+1);
                    }
                }
            }
        }
        return max;
    }

小贴士

1.dp[j][i] 表示子串 A[j..i](闭区间)是否为回文,必须保证 j ≤ i

  1. 判断规则:
  • 首尾不等 → 非回文
  • 首尾相等 + 长度≤2 → 必回文
  • 首尾相等 + 长度 > 2 → 看中间子串是否回文
Code Road Record