问题描述:
给定一个字符串S=A1A2...An,要求找出其最长回文子串(Longest Palindromic Substring)。所谓回文子串就是S的某个子串Ai...Aj为回文。例如,对字符串S=abcdcbeba,它的回文子串有:bcdcb,cdc,beb,满足题目要求的最长回文子串为bcdcb,其长度为5
解法描述:
解法1:
利用全部遍历的思想找出字符串中所有的回文字符串,并判断其对应的长度。然而该算法的复杂度为O(N^4)。对应代码如下:
/*
* 判断字符串是否对称,如果对称则返回1,否则返回0
*/
int Issymmetry(char *a,int len)
{
int i;
int k=0;
if (len == 1)
return 0;
for (i=0;i<len/2;i++)
{
if (a[i] == a[len-1-i])
{
++k;
}
}
if (k == len/2)
return 1;
else
return 0;
}
/*
* 寻找一个字符串中的对称子字符串,并且利用一二维数组保存
*/
int symmetry(char *a,int len)
{
int i,j,l,k;
char *b ;
int max=0;
char *c = (char *)malloc(sizeof(char)*len);
b = (char *)malloc(sizeof(char)*len);
k=0;
for (i=0;i<len;i++)
{
l=0;
for (j=i;j<len;j++)
{
l=0;
for (k=i;k<=j;k++) // 取出a中第i~j个字符串并保存到字符数组c中
{
c[l++]=a[k];
}
c[l]='\0';
if (Issymmetry(c,l) != 0) //判断第i~j个字符串是否是回文字符串
{
if (max < l)
{
max=l;
strcpy(b,c);
}
}
}
}
printf("%s\n",b);
return max;
}
解法2
假设字符串相对于第i个字符对称,所以只需要判断第i个字符前后的字符是否相等即可求出对应的长度。该算法复杂度为O(N^2),然而使用该解法却不能保存对应的最长回文字符串长度
/*
* 算法复杂度只有O(N^2)的算法如下,然而利用该方法不能得到对应的最长循环字符串
*/
// 对aba形式的字符串,进行判断是否为回文字符串并求长度
int maxlength(char *a,int length,int index)
{
int max=1;
int j=1;
while (a[index-j] == a[index+j] && index-j>=0 && index+j < length)
{
++j;
max=max+2;
}
return max;
}
// 对abba形式的字符串,进行判断是否为回文字符串并求长度
int maxlength1(char *a,int length,int index)
{
int max=0;
int j=0;
while (a[index+j+1] == a[index-j] && index-j>=0 && index+j+1 < length)
{
++j;
max=max+2;
}
return max;
}
int max_function(char *a,int length)
{
int i;
int max1,max2,max,temp;
max = -1;
for(i = 1;i < length;i++)
{
max1 = maxlength(a,length,i);
max2 = maxlength1(a,length,i);
temp = (max1 > max2)?max1:max2;
if (temp > max)
{
max = temp;
}
}
return max;
}
其中测试函数:
int main()
{
char *a="googabcdgdcba";
int max1,max2;
//i=Issymmetry(a,strlen(a));
max1 = symmetry(a,strlen(a));
max2 = max_function(a,strlen(a));
printf("%d %d\n",max1,max2);
system("pause");
return 0;
}
对于算法复杂度为O(N)的算法,正在研究中,看到有的博客中谈到需要采用后缀树的思想,由于不太了解最近正在学习。