力扣5.最长回文子串

题目描述

力扣5.最长回文子串_第1张图片

思路

1.能够反复利用已判断好的回文子串

2.当子串s[i+1,j-1]是回文子串时,只要s[i]==s[j],那么s[i,j]也会是回文子串

3.用好动态规划,具体解释在代码注释里

代码

class Solution {
    public String longestPalindrome(String s) {
        int len = s.length();
        //如果是单字符,必定是回文,直接返回s
        if(len < 2) return s;
        //dp[][]表示s[i,...,j]是否是回文
        boolean[][] dp = new boolean[len][len];
        //最长回文子串长度初始化为1
        int maxLen = 1;
        //最长回文子串左边界初始化为0
        int begin = 0;
        char[] ch = s.toCharArray();
        //先进行初始化,所有单个字符都是回文
        for(int i = 0;i < len;i++){
            dp[i][i] = true;
        }
        //j是右边界
        for(int j = 1;j < len;j++){
            //i是左边界
            for(int i = 0;i < len;i++){
                //如果左边界大于右边界,就退出循环
                if(i > j){
                    break;
                }
                if(ch[i] != ch[j]){
                    dp[i][j] = false;
                }else{
                    //假如子串两边都相等,中间只有一个字母,直接返回状态true
                    if(j - i < 3){
                        dp[i][j] = true;
                    }else{
                        //不然当前状态就由上一个子串决定,是由内向外的,假如s[2,3]是回文,s[1]==s[4],
                        //那么s[1,4]也是回文;反之如果s[2,3]不是回文,那s[1,4]也不会是回文
                        dp[i][j] = dp[i+1][j-1];
                    }
                }
                //当dp[i][j]为true且回文子串长度大于最长长度,就更新最长回文子串长度
                if(dp[i][j] && j - i + 1 > maxLen){
                    maxLen = j - i + 1;
                    begin = i;
                }
            }
        }
        return s.substring(begin,begin + maxLen);
    }
}

你可能感兴趣的:(算法题,leetcode,算法)