法一:简单方法
两层循环对字符串中所有的子串进行定位,进而判断是否是回文子串,复杂度O(n^3)。
方法简单,易想到,但暴力,易超时。
for(i=0;i<m;i++)
{
for(j=i;j<m;j++)
{
int ok=1;
for(k=i;k<=i+(j-i)/2;k++) // i,j定位,使用k扫描匹配
if(s[k]!=s[i+j-k]) ok=0;
if(ok && j-i+1>max) {max=j-i+1;x=i;y=j;} //最长更新
}
}
法二:动态规划
还是使用两层循环对子串定位,b[i][j]表示以i,j 为边界的子串是否是回文。
不同的是使用动态规划,通过子结构的递推关系来求取最优解,
b[i][j] = (s[i]==s[j])&&isPa(b,i+1,j-1) // i位置与j位置相同,则判断其去掉两边后的子串
出口: i==j b[i][j]=1
但是时间复杂度O(n^2)&