对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
第一想法是利用LCS,不料几个测试点都崩溃了。借鉴他人的算法,一下就过了。
算法思路:枚举出所有中间的可能情况,然后分别俩头匹配;匹配成功则更新max,不成功则跳出循环。
中间的情况容易漏掉!!!
#include <iostream>
#include<string>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv) {
string str;
getline(cin,str);
int i,j,len=str.length();
int max=0;
for(i=0;i<len;i++){
for(j=0;i-j>=0&&i+j<len;j++){
if(str[i-j]!=str[i+j]){
break;
}
if(2*j+1>max){
max=2*j+1;
}
}
for(j=0;i-j>=0&&i+j+1<len;j++){
if(str[i-j]!=str[i+j+1]){
break;
}
if(2*j+2>max){
max=2*j+2;
}
}
}
cout<<max;
return 0;
}