leetcode:Longest Palindromic Substring

来源:互联网 发布:damn it 编辑:程序博客网 时间:2024/06/05 20:00

回文数

用core[i]表示以i为"核"的最长回文序列

core1[i]是单核回文,例如bacab,是以c为单核

core2[i]是双核回文,例如baccab,是以cc为双核。

代码写得比较冗长,思想就是,当前回文序列为s[i,j],那么只需要看s[i-1]==s[j+1]即可。

边界考虑:s=“a”时,core2无效。


public class Solution {
    public String longestPalindrome(String s) {
        char[] ca=s.toCharArray();
        int n=ca.length;
        int[] core1=new int[n];
        int[] core2=new int[n];
        int[] flag1=new int[n];
        int[] flag2=new int[n];
        int i,f,len1,len2;
  
        //bab
        for(i=0;i<n;i++)
        {
            core1[i]=0;
            flag1[i]=1;
        }
        f=1;len1=0;
        while(f!=0)
        {
            f=0;
            for(i=0;i<n;i++)
            {
                if(flag1[i]==0)
                    continue;
                core1[i]++;
                if(i-core1[i]>=0 && i+core1[i]<n && ca[i-core1[i]]==ca[i+core1[i]])
                    flag1[i]=1;
                else
                    flag1[i]=0;
                f+=flag1[i];
            }
            len1++;
        }
        
        //baab
        for(i=0;i<n-1;i++)
        {
            core2[i]=0;
            if(ca[i]==ca[i+1])
                flag2[i]=1;
            else
                flag2[i]=0;
        }
        f=1;len2=0;
        while(f!=0)
        {
            f=0;
            for(i=0;i<n;i++)
            {
                if(flag2[i]==0)
                    continue;
                core2[i]++;
                if(i-core2[i]>=0 && i+core2[i]+1<n && ca[i-core2[i]]==ca[i+core2[i]+1])
                    flag2[i]=1;
                else
                    flag2[i]=0;
                f+=flag2[i];
            }
            len2++;
        }
        //fidsubtring
        if((len1*2-1)>len2*2 || n==1)
        {
            for(i=0;i<n;i++)
            {
                if(core1[i]==len1)
                    break;
            }
            return s.substring(i-(len1-1),i+len1);
        }
        else
        {
            for(i=0;i<n-1;i++)
            {
                if(core2[i]==len2)
                    break;
            }
            return s.substring(i-(len2-1),i+1+len2);
        }
        
    }
}

0 0