天梯杯 L2-008. 最长对称子串

L2-008. 最长对称子串

时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。

输入样例:
Is PAT&TAP symmetric?
输出样例:
11
这道题目是求最长对称子串嘛,首先我觉得应该考虑的是它为偶数还是奇数的情况。
首先当子字符串为偶数时,应该指的是i+1右边j个字符加上i左边j个字符。
当字符串为奇数时,应该指的是i左边j个字符加上i右边j个字符加第i个字符。
所以对称子字符串必须满足的是 偶数 i+1-j>0 i+j<len str[i-j+1]==str[i+j]
奇数 i-j>0 i+j<len str[i-j]==str[i+j]
当不满足时说明此时的i不适合 跳过(前面两个条件是字符串必须满足的)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
    char str[1010];
    gets(str);
    int maxn=0,tmp;
    int len = strlen(str);
    /*
    string str;
    getline(cin,str);
    int len = str.length();
    *///这是我看柳婼 の blog得到的这种输入,以前没用过,另外代码也是参考的她的,开始自己想的很复杂。。。
    for(int i=0;i<len;i++)
    {
        tmp = 1;//奇数时的情况,tmp不同呀!!!
        for(int j=1;j<=len;j++)
        {
            if(i-j<0 || i+j>=len || str[i-j]!=str[i+j])
                break;//不满足条件了,就跳过,此时的tmp就是i中最长字符串
            tmp += 2;
        }
        maxn = max(maxn,tmp);
        tmp = 0;//偶数时的情况
        for(int j=1;j<=len;j++)
        {
            if(i+1-j<0 || i+j>=len || str[i-j+1]!=str[i+j])
                break;
            tmp += 2;
        }
        maxn = max(maxn,tmp);
    }
    cout << maxn << endl;
    return 0;
}

 

posted on 2017-03-19 10:06  九月旧约  阅读(1892)  评论(0编辑  收藏  举报

导航