原样输出最长回文子串

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXSIZE 5000
/*void Paliandrome(char*);
int main()
{
	char lpStr[] = "aaaMadam,I'm Adamzsd"; 
	printf("源字符串:	%s\n",lpStr);
	Paliandrome(lpStr);
	return 0;
}
void Paliandrome(char lpStr[])
{
	char lpBuf[MAXSIZE];
	int iPos[MAXSIZE];
	int iLen = strlen(lpStr);
	int j = 0;
	for(int i = 0; i < iLen; i++)
		if(isalpha(lpStr[i]))
		{
			lpBuf[j] = toupper(lpStr[i]);
			iPos[j++] = i;
		}
	lpBuf[j] = '\0';
	printf("转换字符串:	%s\n",lpBuf);

	iLen = strlen(lpBuf);
	int MAXLEN = 0;
	int iX,iY;	//原来字符串的位置
	for(i = 0; i < iLen; i=i+1)
	{
		for(j = i; j < iLen; j=j+1)
		{
			bool OK = true;
			for(int t = i; t < j; t++)
			{
				if(lpBuf[t] != lpBuf[i+j-t])
					OK = false; 
			}
			if(OK != false && MAXLEN < j-i+1)
			{
				iX = iPos[i];
				iY = iPos[j];
				MAXLEN = j-i+1;
			}
		}

	}
	printf("最长回文子串:	");
	for(i = iX; i <= iY; i=i+1)
		printf("%c",lpStr[i]);
	printf("\n长度为:		%d\n",MAXLEN);

	return;
}
*/
/*
	上面这种方法效率太低,当5000个a的时候这么枚举就太浪费时间了
	我们可以枚举回文串的中间位置
	注意:当字符串的长度为奇数和偶数的处理是不同的
*/
void Paliandrome(char*);
int main()
{
	char lpStr[] = "aaaMadam,I'm Adamzsd"; 
	printf("源字符串:	%s\n",lpStr);
	Paliandrome(lpStr);
	return 0;
	return 0;
}
void Paliandrome(char lpStr[])
{
	char lpBuf[MAXSIZE];
	int iPos[MAXSIZE];
	int iLen = strlen(lpStr);
	int j = 0;
	for(int i = 0; i < iLen; i++)
		if(isalpha(lpStr[i]))
		{
			lpBuf[j] = toupper(lpStr[i]);
			iPos[j++] = i;
		}
	lpBuf[j] = '\0';
	printf("转换字符串:	%s\n",lpBuf);

	iLen = strlen(lpBuf);
	int MAXLEN = 0;
	int iX,iY;	//原来字符串的位置
	for(i = 0; i < iLen; i++)
	{
		for(j = 0; i-j>=0 && i+j<=iLen; j++)
		{
			//处理iLen为奇数的情况
			if(lpBuf[i-j] != lpBuf[i+j])break;
			if(j*2+1 > MAXLEN)
			{
				MAXLEN = j*2+1;
				iX = iPos[i-j];
				iY = iPos[i+j];
			}
		}
		for(j = 0; i-j>=0 && i+j+1<=iLen; j++)
		{
			//处理iLen为偶数的情况
			if(lpBuf[i-j] != lpBuf[i+j+1])break;
			if(j*2+1 > MAXLEN)
			{
				MAXLEN = j*2+2;
				iX = iPos[i-j];
				iY = iPos[i+j+1];
			}
		}
	}
	printf("最长回文子串:	");
	for(i = iX; i <= iY; i=i+1)
		printf("%c",lpStr[i]);
	printf("\n长度为:		%d\n",MAXLEN);
	return;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值