码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 最长回文子串

时间:2018-05-19 14:44:10      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:输入   bsp   img   位置   左右   最大   .com   假设   暴力   

给定一个字符串 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;
    }
}

结果:

技术分享图片

 

leetcode 最长回文子串

标签:输入   bsp   img   位置   左右   最大   .com   假设   暴力   

原文地址:https://www.cnblogs.com/javaStudy947/p/9060170.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!