求解最大回文子串

版权声明:共同提高:) https://blog.csdn.net/u011436427/article/details/82832911

参考:宇视科技笔试题–求解最长回文子字符串
http://blog.sina.com.cn/s/blog_6ab0b9a80101c9tx.html

strchr和strstr 函数https://www.cnblogs.com/wuyuxuan/p/5541621.html(该blog对strchr的具体用法没有理解,大致了解一下strchr的函数咋用的即可)

输入:
abababaaaaaaaaaa
输出:
aaaaaaaaaa

代码如下:

#include<iostream>
#include<string>
//#include<cstdlib>
#include<stdlib.h>

using namespace std;
//求解最大回文子串

void solvemax(char *str2);
void solvemax(char *str2)
{
	int sum=1,max=1;
	char *index,*first,*next,*p1,*p2;

	while(*str2!='\0')
	{
		first=str2;
		while(first)
		{
			first=strchr(first+1,*str2);
			if(first)
			{
				p1=str2;
				p2=first;
				while(p1!=p2 && p2!=str2)
					{
						p1++;
						p2--;
						if(*p1==*p2)
							sum++;
						else
							break;
					}
				if(p1==p2)
				{
					sum=2*sum-1;
					if(sum>max)
					{
						max=sum;
						index=str2;
					}
					sum=1;//每次需要用来统计下个回文字符串的长度
				}

				if(p2==str2)
				{
					if(sum>max)
					{
						max=sum;
						index=str2;
					}
					sum=1;
				}
			}
		}
		str2++;
		sum=1;
	}
	for(int i=0;i<max;i++)
		cout<<*index++<<" ";
}
int main()
{
	char *str1="abababaaaaaaaaaa";

	solvemax(str1);
	cout<<endl;

	system("pause");
	return 0;
}

在第一版的时候我是这么写的:

void solvemax(char *str2)
{
	int sum=1,max=1;
	char *index,*first,*next,*p1,*p2;

	while(*str2!='\0')
	{
		first=str2;
		while(first)
		{
			next=strchr(first+1,*str2);
			if(next)
			{
				p1=first;
				p2=next;
				while(p1!=p2 && p2!=str2)
					{
						p1++;
						p2--;
						if(*p1==*p2)
							sum++;
						else
							break;
					}
				if(p1==p2)
				{
					sum=2*sum-1;
					if(sum>max)
					{
						max=sum;
						index=str2;
					}
					sum=1;//每次需要用来统计下个回文字符串的长度
				}

				if(p2==str2)
				{
					if(sum>max)
					{
						max=sum;
						index=str2;
					}
					sum=1;
				}
			}
		}
		str2++;
		sum=1;
	}
		
	for(int i=0;i<max;i++)
		cout<<*index++<<" ";
}

第一版写完以后,死活跑不出来正确答案,最后与原版答案对照,发现:

		first=str2;
		while(first)
		{
			next=strchr(first+1,*str2);//错误,这句错误,接下来都是错误
			if(next)
			{
				p1=first;
				p2=next;

上面的几句,写错了,标准答案中的next是用来临时记录位置的,而我起了一个新的名字next就不行了,说明在使用strchr的时候,函数的返回值next必须提前指定一个位置才行啊!标准答案就指定了字符串的首地址了,标准答案用的first!!
新定义的next指针不能乱定义,需要指向相应的位置

同时注意,在确定所找到的回文字符串的首个地址的时候,不要这么去写:

	}
				if(p1==p2)
				{
					sum=2*sum-1;
					if(sum>max)
					{
						max=sum;
						index=first;//错误
					}
					sum=1;//每次需要用来统计下个回文字符串的长度
				}

				if(p2==str2)
				{
					if(sum>max)
					{
						max=sum;
						index=first;//错误
					}
					sum=1;

要不然输出会有know的错误,这个是老问题了,first成为了野指针,不知道指向哪里了。

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/82832911
今日推荐