算法题 - leetCode - 最长回文子串

1,801 阅读1分钟

前言

题目链接:最长回文子串

解题思路

做完这道题,去看Leetcode 的题解,才发现有很多种方法,我这方法算是动态规划吧。 主要思路是,求最长回串,那么其实即是求 字符串和反串的最长公共子串。当然即使这个公众子串还有一个特点,那就是该子串在 原字符串中的起始位置等于 反串的结束位置。

代码

class Solution {
  public String longestPalindrome(String s){
        String re = s.charAt(0)+"";//默认肯定有一个字符
        int left = 0, right = s.length() - 1;
        int M = s.length();
        int dp[][] = new int[M+2][M+2];
        for (int i = 1; i <= M; i++)
            for (int j = M; j >= 1; j--) {
                if (s.charAt(i - 1) == s.charAt(j -1)) {
                    dp[i][j] = dp[i - 1][j + 1] + 1;
                    if (dp[i][j] > 1 && Math.abs(dp[i][j] - dp[j][i]) == i - j) {
                        if (re.length() < i - j + 1) {
                            re = s.substring(j - 1, i);
                        }
                    }
                }
            }
        return re;
    }

}

结尾

本题的解法空间时间复杂度均为O(n^2),有同学想了解其他解法可以去leetcode题目详解看下其他解法