5. 最长回文子串

5. 最长回文子串

1.状态定义

//dp[i][j]表示s[i…j]是否为回文串
 
2.状态转移方程
dp[i][j] = (s[i] == s[j]) && dp[i + 1][j - 1]
 
3.边界值处理
dp[i][i] = true
 
class Solution {
    public String longestPalindrome(String s) {

        int len = s.length();
        if(len < 2) return s;

        int maxLen = 1;
        int begin = 0;

        //dp[i][j]表示s[i…j]是否为回文串
        boolean[][] dp = new boolean[len][len];

        for(int i = 0; i < len; i++)
            dp[i][i] = true;

        char[] charArray = s.toCharArray();
        for(int j = 1; j < len; j++) {
            for(int i = 0; i < j; i++) {
                //左右边界不相等,必不可能为回文串
                if(charArray[i] != charArray[j])
                    dp[i][j] =false;
                //左右边界相等的情况下
                else {
                    //i, j索引差小于3, i + 1 和 j - 1索引差小于1(0 或-1)
                    //为0时s[i + 1 .. j - 1]长度为1,为-1时长度为0,此时左右边界相等即为回文串
                    if (j - i < 3)
                        dp[i][j] = true;
                    //否则看去掉左右边界的原串是否是回文串
                    else
                        dp[i][j] = dp[i + 1][j - 1];
                }

                //是回文串且更长
                if(dp[i][j] && j - i + 1 > maxLen) {
                    maxLen = j - i + 1;
                    begin = i;
                }
            }
        }

        return s.substring(begin, begin + maxLen);
    }
}

 


posted @ 2021-10-30 18:10  星予  阅读(24)  评论(0编辑  收藏  举报