5. 最长回文子串

Posted doona-jazen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5. 最长回文子串相关的知识,希望对你有一定的参考价值。

题目:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:
输入: "cbbd"
输出: "bb"

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

分析:

很容易可以想到使用简单循环来处理,从第一个字符开始,依次遍历,然后判断每次循环得到的是否回文,取长度最长的输出,按照这种思路可以得到如下代码:

技术图片
public static String longestPalindrome(String s) {
        StringBuilder result = new StringBuilder();
        if ("".equals(s)) {
            return result.toString();
        }
        for (int i = 0; i < s.length(); i++) {
            StringBuilder temp = new StringBuilder();
            for (int j = i + 1; j <= s.length(); j++) {
                temp.append(s.substring(j - 1,j));
                if (temp.toString().equals(temp.reverse().toString())) {
                    if (temp.length() > result.length()) {
                        result.delete(0, result.length());
                        result.append(temp);
                    }
                }
                temp.reverse();
            }
        }
        return result.toString();
    }
思路1

但这种方式对于字符串过长时,耗时较长,因此是无法全部通过LeetCode的测试用例的,更换思路:

使用中心拓展的方式去找回文数,相对来说时间可以缩短一半。但要注意奇偶数的处理!

技术图片
public static String longestPalindrome2(String s) {
        int n = s.length();
        String res = "";
        boolean[][] dp = new boolean[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = i; j >= 0; j--) {
                if (s.charAt(i) == s.charAt(j) && (i - j < 2 || dp[i - 1][j + 1]))
                    dp[i][j] = true;
                if (dp[i][j] && (i - j + 1 > res.length())) {
                    res = s.substring(j, i + 1);
                }
            }
        }
        return res;
    }
思路2

 

以上是关于5. 最长回文子串的主要内容,如果未能解决你的问题,请参考以下文章

leectcode 动态规划5.最长回文子串

LeetCode 5 最长回文子串

leetcode-5 最长回文子串(动态规划)

5. 最长回文子串

5-最长回文子串

[5]. 最长回文子串