求字符串中最长回文子串

问题描述:

    给定一个字符串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)的算法,正在研究中,看到有的博客中谈到需要采用后缀树的思想,由于不太了解最近正在学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值