版权声明:共同提高:) 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成为了野指针,不知道指向哪里了。