天梯杯 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; }
彼时当年少,莫负好时光。