22 最长回文子串的3中解决方式

问题描述:给你一个字符串s,找到s中最长的回文子串

暴力求解:通过两个循环遍历所有的子串,找到最长的那个子串并进行记录后返回

Boolean isPalindrome(String s,int indexStart,int indexEnd)
{
if(indexStart==indexEnd)
{
return true;
}
int start=indexStart;
int end=indexEnd;
while(end>start)
{
if(s.charAt(end)!=s.charAt(start))
{
return false;
}
}
​​​​​​​return true;
}

public String maxLengthSubString(String s)
{
int start=0;
int end=0;
int max=Integer.MIN_VALUE;
for(int i=0;imax)
{
start=i;
end=j;
max=Math.max((j-i+1),max);
}
}
}
}
return s.substring(start,end+1);
}

动态规划求解:定义dp[i][j]为以[i,j]为头尾的字符串是否为回文子串,如果s.charAt(i)==s.charAt(j)则dp[i][j]=dp[i-1][j-1](需要考虑j-i=1的情况)

public String maxPalindrome(String s)
{
Boolean[][]dp=new Boolean[s.length()][s.length()];
dp[0][0]=1;
int start;
int end;
int max=Integer.MIN_VALUE;
for(int i=1;i0;j--)
{
if(s.charAt(i)==s.charAt(j))
{
if(j-i==1)
{
dp[i][j]=true;
if(dp[i][j]>max)
{
max=Math.max(j-i+1,max);
start=i;
end=j;
}
}else
{
dp[i][j]=dp[i-1][j-1];
if(dp[i][j]>max)
{
max=Math.max(j-i+1,max);
start=i;
​​​​​​​end=j;
}
}
}
}
}
return s.substring(i,j+1);
}

中心扩散法求解:对于每个元素都可以以其为中心点进行寻找,还有一种情况是偶数,需要判断前一个字符与其是否相等,从而进行偶数的判断;

private int isOddPalindrome(String s,int index)
{
int left=index-1;
int right=index+1;
int count=1;
while(left>=0&&right-0&&rightmax)
{
max=Ocount;
start=i-Ocount>>1;
end=i+Ocount>>1;
}
if(s.charAt(i)==s.charAt(i-1))
{
int Ecount=isEvenPalindrome(s,i);
if(Ecount>max)
{
max=Ecount;
start=i-Ecount>>1;
end=i+Ecount>>1-1;
}
}
}
return s.substring(start,end+1);
}

你可能感兴趣的:(JAVA刷题500道,java,算法,数据结构)