5-最长回文子串

 

 思路:暴力法的改进

 

 

class Solution {
  public String longestPalindrome(String s) {
    if(s==null||s.length()==0)return s ;
    int length=s.length();
    boolean[][] P=new boolean[length][length];//P[a][b]表示下标[a][b]这个范围组成的子串是不是回文子串
    int maxlen=0;//目前最长子串长度
    String max="";//最长子串
    for(int i=0;i<length;i++)//长度为1,只有一个字符,肯定是回文串
    {
        P[i][i]=true;
    }
    for(int i=0;i<length-1;i++)//长度为2的子串,看俩字符是否相等,相等的话就是回文串
    {
        P[i][i+1]=(s.charAt(i)==s.charAt(i+1));
    }
    for(int len=1;len<=length;len++)//所有长度(肯定没有这么多,可以接着判定)
    {
        for(int start=0;start<length;start++)
        {
            int end=start+len-1;//子串长度为len时,终点的下标
            if(end>=length)//此时下标过界,
            {
                break;
            }
            if(start==end||start==end-1)//子串只有一个或俩字符时,P已经有了
            {
                if (P[start][end] && len > maxlen) 
                {
                max = s.substring(start, end + 1);
                }
            }
            else//子串不止两个时
            {
                P[start][end]=P[start+1][end-1]&&(s.charAt(start)==s.charAt(end));
                if (P[start][end] && len > maxlen) 
                {
                max = s.substring(start, end + 1);
                }
            }
        }
    }

    return max;


}


}

  

 

posted @ 2020-04-20 16:58  弓呆的胖次  阅读(102)  评论(0编辑  收藏  举报