codeTop100题(11)5. 最长回文子串

79 阅读1分钟

1. 题目

5. 最长回文子串

2. 分析

看到最长两个字,第一个想到的就是动态规划,然而动态规划需要确定dp数组的含义,以及递推公式。

再让我们回到题目,题目要求是找到最长的回文子串,首先是回文串的定义为一个可以镜像对称的字符串:例如a,aa,aba,abba;

我们可以发现一个规律:假如首位字符相同,那么最终这个字符串是否回文串就由里面的字符串觉得了,由此我们可以得到:

  1. dp数组含义从i到j的子串是否回文串
  2. 公式
  • 当a[i] == a[j] 时 当dp[i+1][j-1] > 0 或者 长度 == 2 时 dp[i][j] = dp[i+1][j-1] + 2;
  • a[i] != a[j] dp[i][j] = 0;
  1. 数组初始化,定义长度为1 的全都为回文串
  2. 我们按照从长度2开始一直到整个字符串的顺序进行遍历

3. 代码

class Solution {
    public String longestPalindrome(String s) {
        int[][] dp = new int[s.length()][s.length()];
        for (int i = 0; i < s.length(); i++) {
            dp[i][i] = 1;
        }
        int max = 1;
        int l = 0, r = 0;
        for (int i = 2; i <= s.length(); i++) {
            for (int j = 0; j <= s.length() - i; j++) {
                int t = j + i - 1;
                if (s.charAt(j) == s.charAt(t)) {
                    if (dp[j + 1][t - 1] > 0 || i == 2) {
                        dp[j][t] = dp[j + 1][t - 1] + 2;
                        if (dp[j][t] > max) {
                            max = dp[j][t];
                            l = j;
                            r = t;
                        }
                    }
                }
            }
        }
        return s.substring(l, r + 1);
    }
}