您的位置:首页 > 其它

L2-008. 最长对称子串

2016-05-15 20:56 225 查看

L2-008. 最长对称子串

时间限制100 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者陈越对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。输入格式:输入在一行中给出长度不超过1000的非空字符串。输出格式:在一行中输出最长对称子串的长度。输入样例:
Is PAT&TAP symmetric?
输出样例:11今天我去参加了天梯赛,感觉还行,我讲一下一个题就是最长对称子串:首先,要明白题意,,,,对称对称,就是沿一条线对称,而这条线有两种情况,一种:是像例题一样的把一个字符看成是一条线;另一种是把字符与字符间的空隙看成是一条线,,,,,,明白吗?(PAT&TAP这就是把&看成是一条线)(asddsa这就是把dd中间的空隙看成是一条线);;;;;通过以上的例子我们就发现了这个题的这种思想有两种方法::::而怎样去A呢?第一种应该把当成一条线的字符看成中间再往两边查:这就初始化为1了,,第二种就把空隙看成线往两边查,这就初始化为0了,,,看代码详细一点查看源代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
char a[10005];   //字符串的储存
int b[10005];    //第一种方法
int c[10005];    //第二种方法
int main()
{
int n,m,i,j;
gets(a);
int len = strlen(a);
for(i = 0;i < 10005; i++)
{
b[i] = 1;            //初始化为1;;
}
for(i = 0;i < 10005; i++)
{
c[i] = 0;             //初始化为0;;
}
for(i = 1;i < len; i++)
{
for(j = 1;j <= i; j++)   //从字符的两边开始查那就把j的开始为1;;
{
if(a[i+j] == a[i-j])     //如果相同
b[i] = b[i]+2;       //那这个地方所配对的b加2;;
else
break;              //如果不相同直接跳出
}
}
for(i = 1;i < len; i++)
{
for(j = 0;j <= i; j++)    //从空隙的两边开始查那就把j的开始为0;;
{
if(a[i+j+1] == a[i-j])        //这就是关键要正好为空隙的两边
c[i] = c[i]+2;           //相同加2
else
break;
}
}
int max = 0;
for(i = 0;i < len;i++)           //找出最大的,,
{
if(max < b[i])
max = b[i];
if(max < c[i])
max = c[i];
}
printf("%d\n",max);
return 0;
}
代码菜鸟,如有错误,请多包涵!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: