最长回文子串

129 阅读1分钟

给你一个字符串 s,找到 s 中最长的回文子串。

示例:

输入:s = "babad"
输出:"bab"
解释:"aba" 也是一个有效答案。

定义状态:

我们定义一个二维数组dp,其中dp[i][j]表示从i到j的子串是否为回文子串。

状态转移:

如果s[i]等于s[j],并且s[i+1]到s[j-1]也是回文子串,那么dp[i][j]也是回文子串。同时,如果s[i]等于s[j]并且j-i小于等于2,那么dp[i][j]也是回文子串。

具体来说,我们从长度为1的子串开始,逐步增加长度,直到整个字符串。这样我们就可以依次计算出所有长度的子串是否为回文子串。对于每个回文子串,我们记录它的起始位置和结束位置,最终返回最长的回文子串。

public String longestPalindrome(String s) {
    int n = s.length();
    boolean[][] dp = new boolean[n][n];
    String res = "";
    for (int len = 1; len <= n; len++) {
        for (int i = 0; i + len - 1 < n; i++) {
            int j = i + len - 1;
            if (len == 1) {
                dp[i][j] = true;
            } else if (len == 2) {
                dp[i][j] = (s.charAt(i) == s.charAt(j));
            } else {
                dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i+1][j-1]);
            }
            if (dp[i][j] && len > res.length()) {
                res = s.substring(i, i+len);
            }
        }
    }
    return res;
}