L2-008. 最长对称子串
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:Is PAT&TAP symmetric?输出样例:
11
其实就是把输入的串逆置
之后找最大公共子串
采用了 左上角元素加1的方法
找最长公共子串
详见代码
#include <bits/stdc++.h>
using namespace std;
char s[1111],p[1111];
int dp[1010][1010];
int main()
{
int i,j = 0;
int len;
cin.getline(s,1111);
len = strlen(s);
for(i=len-1; i>=0; i--) ///逆置s
{
p[j] = s[i];
j++;
}
p[j] = 0;
memset(dp,0,sizeof(dp)); ///初始化0
int ans = 0;
for(i=0; i<len; i++) ///求最大公共子串
{
for(j=0; j<len; j++)
{
if(s[i] == p[j]) ///相同字符
{
if(i-1>=0 && j-1>=0)
{
dp[i][j] = dp[i-1][j-1]+1; ///有左上角就相加
}
else dp[i][j]++; ///没有就++
ans = max(ans,dp[i][j]); ///找到最大
}
}
}
cout<<ans<<endl;
return 0;
}