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

LeetCode问题5

时间:2017-09-24 23:32:21      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:sum   时间复杂度   nbsp   longest   time   turn   return   substr   mic   

Longest Palindromic Substring

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

最开始的采用了很暴力的方法如下:

class Solution {
    public String longestPalindrome(String s) {
        int i=0,j=0,length=s.length(),maxlength=0;
        int rei=0,rej=0;
        for (i=0;i<length;i++)
        {
            for (j=i;j<length;j++)
            {
                if(s.charAt(i)==s.charAt(j))
                {
                    if(isPalin(s.substring(i,j+1)))
                    {
                        if(j+1-i>maxlength)
                        {
                            maxlength=j+1-i;
                            rei=i;
                            rej=j+1;
                        }     
                    }
                }
            }
        }
        return s.substring(rei,rej);
    }
    boolean isPalin(String s)
    {
        int length=s.length();
        for(int i=0;i<length/2;i++)
        {
            if(s.charAt(i)==s.charAt(length-1-i));
            else
                return false;
        }
        return true;
    }
}

method isPalin()判断一个子字符串是否为回文的。

一个回文的字符串必定首尾相同,通过这个规律先减小部分计算量,只对首尾相同的子字符串判断是否回文。

简单的字符串可以应对,无规律的字符串也可以大程序减小计算量,但是对于bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb这种没有任何作用,运行结果:Time limitted exceeded。

LeetCode可以接受的时间复杂度为O(n^2),必须要采用一些策略:

1、对于一个从i到j的回文序列,它从i+1到j-1也必定是回文序列,可以利用这个方案提升效率。

2、从回文序列的中心下手。

提升效率后的代码:

 

//答案的算法
class Solution {
    public String longestPalindrome(String s) 
    {
        int i=0,length=s.length();
        int maxlength=0,templength=0,center=0;
        //中心在左边的情况
        for (i=0;i<length;i++)
        {
            templength=Palin(s.substring(0,i+1));
            if(maxlength<templength)
            {
                maxlength=templength;
                center=i;
            }
        }
        //中心在右边的情况
        for (i=length;i<2*length-1;i++)
        {
            templength=Palin(s.substring(i-length+1,length));
            if(maxlength<templength)
            {
                maxlength=templength;
                center=i;
            }
        }
        System.out.println(center);
        System.out.println(maxlength);
        if(center%2==0)
        {
            return s.substring(center/2-maxlength/2,center/2-maxlength/2+maxlength);//注意这里center/2-maxlength/2+maxlength不能简化成center/2+maxlength/2,考虑数据类型当center=0,maxlength=1,前式为1,后式为0;
        }
        else
        {
            return s.substring(center/2+1-maxlength/2,center/2+1-maxlength/2+maxlength);
        }
    }
    //s以中点为中心的回文最大长度
    //如abbab,返回1而非真正的4
    static int Palin(String s)
    {
        int length=s.length();
        int half=(length-1)/2;
        int i=half;
        //为利用中心的性质,必须从中间向两边计算,同时计数
        while(i>=0)
        {
            if(s.charAt(i)==s.charAt(length-i-1))
                i--;
            else
                break;                
        }
        if(length%2==0)
            return 2*(half-i);
        else 
            return 2*(half-i)-1;
    }
}
Palin(s.substring(i-length+1,length));
return s.substring(center/2-maxlength/2,center/2-maxlength/2+maxlength);

mad,水平好低,思路很简单,但是边界值处理要头脑清晰才行,上面两句调试了一段时间。

LeetCode问题5

标签:sum   时间复杂度   nbsp   longest   time   turn   return   substr   mic   

原文地址:http://www.cnblogs.com/Einsler/p/7588607.html

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