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

 

posted @ 2019-10-24 20:43  Jazen-Fowr  阅读(100)  评论(0编辑  收藏  举报