leetcode.字符串.5最长回文子串-Java

时间:2019-11-11
本文章向大家介绍leetcode.字符串.5最长回文子串-Java,主要包括leetcode.字符串.5最长回文子串-Java使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1. 具体题目

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

示例 1:  输入: "babad"  输出: "bab"

注意: "aba" 也是一个有效答案。

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

2. 思路分析

法一:暴力法

  选出所有子字符串可能的开始和结束位置,并检验它是不是回文。两层 for 循环得到所有子串,对每个子串用 for 循环再判断是否为回文,所以时间复杂度为O(n^3)。会超时。

法二:动态规划

  为了改进暴力法,考虑避免在验证回文时进行不必要的重复计算:若已经知道 “bab”是回文,那么“ababa” 一定是回文,因为它的左首字母和右尾字母是相同的。

  

3. 代码

  不想写了,单纯记录下这题的思路,代码copy自windliang

public String longestPalindrome(String s) {
    int length = s.length();
    //用数组P[start][end]记录从start开始到end为止的子序列是否为回文序列
    boolean[][] P = new boolean[length][length];
    int maxDist = 0;
    String maxPal = "";
    for (int dist = 1; dist <= length; dist++) //遍历所有子序列的长度
        for (int start = 0; start < length; start++) {
            int end = start + dist - 1;
            if (end >= length) //下标已经越界,结束本次循环
                break;
            P[start][end] = (dist == 1 || dist == 2 || P[start + 1][end - 1]) && s.charAt(start) == s.charAt(end); //长度为 1 和 2 的单独判断
            if (P[start][end] && dist > maxDist) {
                maxPal = s.substring(start, end + 1);
            }
        }
    return maxPal;
}

原文地址:https://www.cnblogs.com/XRH2019/p/11837048.html