最长回文子串

20 篇文章 0 订阅
void huiwen(const char *p){
	int n = strlen(p);
	int maxlen = 0;
	int l,r;
	int start=0;
	bool flag=0;
	char res[BUFFSIZE];
	for(int i=1;i<n;++i){
		int curLen=0;
		l=i-1;
		if(p[i]==p[i+1]) 
		{
			r=i+2;//偶回文
			flag=0;
		}
		else
		{
			r=i+1;//奇回文
			flag=1;
		}
		while(l>=0 && r<n && p[l]==p[r]){
			--l;
			++r;
			++curLen;
		}
		if(0==flag){
			if(2*(curLen+1)>maxlen){
				start=l+1;
				maxlen=2*(curLen+1);
			}
		}else{
			if((2*curLen+1)>maxlen){
				start=l+1;
				maxlen=2*curLen+1;
			}
		}
	}
	memmove(res,p+start,maxlen);
	res[maxlen]='\0';
	printf ("longest huiwen string  is: %s\n", res);
}

给定一个字符串,找出其中的最长回文子串。所谓的最长回文子串就是正着读和反着读都是一样的字符串。

例如:abccbabcddcba,最长的为abcddcba,长度为8。

最长回文子串存在两种情况:奇回文和偶回文。上面的例子是偶回文,abcba这样的就是奇回文。

解决这个问题的最简单思路是,以每个字符为中心左右暴力依次判断,时间复杂度最坏是O(n^2).

代码如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值