leetcode 最长回文子串

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

示例 1:

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

示例 2:

输入: "cbbd"
输出: "bb"

这类问题通常有四个解法:
1.暴力法,即把所有子串都遍历一遍,并判断出最长的回文子串,因为遍历所有子串是O(n^2),判断是否是回文子串是O(n),这三个是嵌套循环,所以时间复杂度是O(n^3)。
2.中心扩展法,即遍历一遍字符串,并把当前字符从当前位置往左右两边辐射,记录最长子串的初始下标和长度,时间复杂度为O(n^2);
3.动态规划法
4.Manacher法,时间复杂度为O(n)

由于对3和4不太熟悉,所以第一次做时采用的是第二种方法:
class Solution {
    public String longestPalindrome(String s) {
        int len=s.length();
        int start=0;
        int max=0;
        if (len==1)
            return s;
        //当回文中心是一个字符时,形如"aba"
        for (int i=0;i<len ;i++ )
        {
            int j=i;
            int k=i;
            while (j>=0&&k<len&&s.charAt(j)==s.charAt(k))
            {
                if ((k-j+1)>max)
                {
                    start=j;
                    max=k-j+1;
                }
                j--;
                k++;
            }
        }
        //当回文中心是两个相同的字符时,形如"abba"
        for (int i=0;i<len ; i++)
        {
            int j=i;
            int k=i+1;
            while (j>=0&&k<len&&s.charAt(j)==s.charAt(k))
            {
                if ((k-j+1)>max)
                {
                    start=j;
                    max=k-j+1;
                }
                j--;
                k++;
            }
        }
        if (max>=0)
        {
            return s.substring(start,start+max);
        }
        return null;
    }
}

结果:

猜你喜欢

转载自www.cnblogs.com/javaStudy947/p/9060170.html