• 天梯杯 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;
    }
    彼时当年少,莫负好时光。
  • 相关阅读:
    java中数据库通用层
    java中dao层的通用层,通过反射机制,操作数据库的增删改,适用的范围是不包含属性类
    反射,类,构造方法,方法,属性
    如何求组合数(逆元)
    Go Home
    Dubious Document
    Factors of Factorial
    Lining Up
    AtCoDeer and Rock-Paper
    Boxes and Candies
  • 原文地址:https://www.cnblogs.com/l609929321/p/6579524.html
Copyright © 2020-2023  润新知