1210 最长的回文&字符串基础常识

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值