Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given "Is PAT&TAP symmetric?", the longest symmetric sub-string is "s PAT&TAP s", hence you must output 11.
Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.
Output Specification:
For each test case, simply print the maximum length in a line.
Sample Input:Is PAT&TAP symmetric?Sample Output:
11
——————————
暴力搜索
i为对称中心。。。。
部分错误,主要是因为自己没有考虑到偶数对称。。。。。
这就比较麻烦了。。。。
看了下童靴的,有思路了,直接在两者之间插入一个特殊的数值。。。。。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define MAX 1010
int main(int argc, char** argv) {
char s[MAX];
int i=0,res=1;
gets(s);
int len=strlen(s);
//cout<<len;
for(i=0; i<len; i++){
int l,r,step=1;
for(l=i-1,r=i+1; l>=0&&r<len; l--,r++){
if(s[l]!=s[r]) break;
step+=2;
}
res=max(res,step);
}
printf("%d\n",res);
return 0;
}
我的AC代码是分情况来遍历。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define MAX 10010
int main(int argc, char** argv) {
char s[MAX];
int i=0,res=1;
gets(s);
int len=strlen(s);
//cout<<len;
for(i=0; i<len; i++){//奇数对称
int l,r,step=1;
for(l=i-1,r=i+1; l>=0&&r<=len-1; l--,r++){
if(s[l]!=s[r]) break;
step+=2;
}
res=max(res,step);
}
for(i=0; i<len; i++){//奇数对称
int l,r,step=0;
for(l=i,r=i+1; l>=0&&r<=len-1; l--,r++){
if(s[l]!=s[r]) break;
step+=2;
}
res=max(res,step);
}
printf("%d\n",res);
return 0;
}
童靴的呢,是在任意两者之间插入一个数,找到最大的max数后,除以2即可。
#include<iostream>
#include<string.h>
#include<vector>
#define Max 10000
int dp[2*Max+1];
char str[Max];
int mmax(int a, int b)
{
if(a > b) return a;
else return b;
}
int main()
{
while(gets(str))
{
//memset(dp, -1, sizeof(dp));
int len = strlen(str);
//insert special character into str, must not appeared in str
std::vector<int> magic;
for(int i = 0; i < len; ++i)
{
magic.push_back(-1);//special character
magic.push_back(str[i]);//character to int
}
magic.push_back(-1);
//enumerate center point for magic vector
len = (int)magic.size();
int max = 1;
for(int i = 1; i < len; ++i)
{
int l, r;
int step = 1;
for(l = i-1, r = i+1; l >= 0 && r < len; l--, r++)
{
if(magic[l] != magic[r])
break;
step += 2;
}
max = mmax(max, step);
}
printf("%d\n", max/2);
}
return 0;
}