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;
}
}

浙公网安备 33010602011771号