回文字串的问题

//输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串中连续出现的字符片段。回文的含义是:正着看和倒着看相同,如abba和yyxyy。
//在判断时,应该忽略所有的标点和空格,且忽略大小写,但输出应该保留原样(在回文串的首部和尾部不要输出多余字符)。输出字符串长度不超
//过5000,且占据单独的一行。应该输出最长的回文串,如有多个,输出的起始位置靠左的。
//样例输入:Confuciuss say: Madam, I'm Adam.
//样例输出:Madam, I'm Adam
///////////////////////////////////////////////////////////////////////////////////////////
#if 0
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXN 5000

char buf[MAXN],s[MAXN];

int main(void)
{
	int n, m = 0,max = 0;
	int i,j,k;
	fgets(buf,sizeof(s),stdin);
	n = strlen(buf);
	for(i = 0; i <= n; i++)
	{
		if(isalpha(buf[i]))
		{
			s[m++] = toupper(buf[i]);
		}
	}
	for(i = 0; i < m; i++)
	{
		for(j = i; j < m; j++)
		{
			int ok = 1;
			for(k = i; k <= j; k++)
			{
				if(s[k] != s[i+j-k])
				{
					ok = 0;
				}
			}
			if(ok && j-i+1 > max)
			{
				max = j-i+1;
			}
		}
	}
	printf("max = %d\n",max);

	return 0;
}
#endif

#if 1
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXN 5000

char buf[MAXN],s[MAXN];
int p[MAXN];
int main(void)
{
	int n,m = 0,max = 0,x,y;
	int i,j;
	fgets(buf,sizeof(s),stdin);
	n = strlen(buf);
	for(i = 0; i < n; i++)
	{
		if(isalpha(buf[i]))
		{
			p[m] = i;
			s[m++] = toupper(buf[i]);
		}
	}
	for(i = 0; i < m; i++)
	{
		for(j = 0; i-j >=0 && i+j < m; j++)
		{
			if(s[i-j] != s[i+j])
			{
				break;
			}
			if(j*2+1 > max)
			{
				max = j*2+1;
				x = p[i-j];
				y = p[i+j];
			}
		}
		for(j = 0; i-j >= 0 && i+j+1 <m; j++)
		{
			if(s[i-j] != s[i+j+1])
			{
				break;
			}
			if(j*2+2 > max)
			{
				max = j*2+2;
				x = p[i-j];
				y = p[i+j+1];
			}
		}
	}
	for(i = x; i <= y; i++)
	{
		printf("%c",buf[i]);
	}
	printf("\n");

	return 0;
}

#endif

  

原文地址:https://www.cnblogs.com/tslDream/p/4454468.html