Leetcode 5. 最长回文子串 [java][动态规划]版

206 阅读1分钟

题目

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

解题思路

i字串开始位置,j字串结束位置。

核心思想当一个字串{i,j}是回文字符串的时候,那么{i+1,j-1}也一定会是一个回文字串

使用一个数组dp来保存{i,j}是不是一个回文子串。 保存最大的字串长度,当有回文子串长度大于当前最大的时候替换掉。

代码

class Solution {
    public String longestPalindrome(String s) {
        if (s.length() < 2){
            return s;
        }
        int len = s.length();
        boolean[][] dp = new boolean[len][len];
        int begin = 0;
        int maxLen = 1;
//        假设字串的长度,从2最小,到整个串的大小
        for(int l = 2;l <= len ; l++){
            for (int i = 0; i < len; i++) {
                int j = i + l -1;//开始位置,+子串长度 -1 得到i + 子符串长度对应的 j点
                if (j >= len){
                    break;//数组下表越界了,退出内层循环
                }
                if (s.charAt(i)!=s.charAt(j)){
                    dp[i][j] = false;
                }else {
                    if (j - i + 1 <= 3){//j - i + 1 得到字串的长度,长度为2or3的情况直接赋值为true,因为已经是最内层了
                        dp[i][j] = true;
                    }else {
                        dp[i][j] = dp[i+1][j-1];//外层字串相等的情况,是不是回文字串取决于类层的子串是不是回文字串
                    }
                }
                //更新最长字串,当前的i-j是回文字串,且长度大于最长的,替换到最长的
                if(dp[i][j] && j - i + 1 > maxLen){
                    maxLen = j - i + 1;
                    begin = i;
                }
            }
        }
        return s.substring(begin,begin+maxLen);
    }
}