1210 最长的回文
这个题凭感觉我觉得是…
唉,感觉一年没碰的东西,毕竟还是生疏了不少
是一个纯纯的搜索
首先我们先来看看一些字符串的基础知识,
首先我觉得关于字符串的知识我真的很懵逼,现在我要重新拾起来
字符串的类型
char a[100]
string a
第一个定义有长度,定义的是数组
第二个定义无限长度,定义的是串
strlen (a)
a.length
第一个是数组的长度,第二个的串的长度
cin>>a cout<<a scanf(“%s”,a) printf(“%s”,a) 数组类型
scanf(“%s”,a)不读空格,getlint(cin,a),a.size()字符串类型
字符串都是以’/0’结尾
还有就是回文的判断
其实我比较的傻,对于这样枚举类的题,其实就是一个区间类的枚举,枚举所有的字符串判断是否回文,并且这里有一个难点就是
我们需要另外保存一个源数据,因为我们操作的是不带空格符号,但是最后输出的源数据是带有的
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
using namespace std;
char org[200001];char sss[200001];//一个是滤过数组不含空格,一是最后的原数据
char line[90];
int pos[200001];
int pl=0;
bool chk(int st,int length)
{
if(st+length>pl)return false;
for(int i=0;i<length/2;i++)
{
if(sss[i+st]!=sss[st+length-i-1])
return false;
}
return true;
}
int main()
{
while(cin.getline(line,200))//循环无限输入,非常厉害
{
strcat(org,line);//存储长度
strcat(org,"\n");
}
int length=strlen(org);
for(int i=0;i<length;i++)//滤过字符串,并且重新保存一份新的,不破坏源数据
{
if(org[i]>='a'&&org[i]<='z')
{
sss[pl]=org[i];//保存
pos[pl]=i;
pl++;
}
if(org[i]>='A'&&org[i]<='Z')
{
sss[pl]=org[i]+32;
pos[pl]=i;
pl++;
}
}//总的长度
int maxn=-1,st=0;
for(int i=0;i<pl;i++)//所有的开始
{
for(int j=maxn+1;j<=2010;j++)//开始往后枚举区间
{
if(chk(i,j)&&j>maxn)//是回文数,保存最长长度
{
maxn=j;//保存结尾
st=i;//保存开始
}
}
}
cout<<maxn<<endl;
for(int i=pos[st];i<=pos[st+maxn-1];i++)
{
cout<<org[i];
}
return 0;
}