【LeetCode】最长回文子串Java题解

163 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目描述

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

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的每日一题是求最长回文子串题目。“回文串”是一个正读和反读都一样的字符串。一个字符也是回文串。
  • 我们定义 dp 二维数组表示当前是否是回文串。字符相等的时候为true。我们枚举子串的长度,从2开始,然后枚举首尾字符做判断是否回文,枚举过程中,不断更新最大的长度,代码如下:

通过代码

class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        if (n < 2) {
            return s;
        }

        int maxLen = 1;
        int begin = 0;

        boolean[][] dp = new boolean[n][n];
        for (int i = 0; i < n; i++) {
            dp[i][i] = true;
        }

        char[] charArray = s.toCharArray();
        for (int subStrlength = 2; subStrlength <= n; subStrlength++) {
            for (int i = 0; i < n; i++) {
                int j = i + subStrlength - 1;
                if (j >= n) {
                    break;
                }
                if (charArray[i] != charArray[j]) {
                    dp[i][j] = false;
                } else {
                    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);
    }
}

image.png

总结

  • 上述算法的时间复杂度是O(n * n), 空间复杂度是O(n * n)
  • 坚持算法每日一题,加油!