L2-008. 最长对称子串
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:Is PAT&TAP symmetric?输出样例:
11
思路:
恩,我好像傻傻分不清子序列和子串的区别,然后怼死在这题上,每次在训练的时候碰到自己的思维误区的时候,就感觉自己做了有营养的题目。
子串的话就好做多了,最简单的就是暴力o(n^2)去暴力区间,然后再花o(n)的时间去check是否是回文串。
还有一种做法是o(n^2)的, 我们去枚举字符串里每个字符,把这个字符当做回文串的中心去往外扩展,如果两端的字符相等就扩展,如果不等,那么再扩展下去也就肯定不是回文串了,所以停止扩展,每次都更新下最大长度。要注意下对奇数、偶数的回文串进行判定。
o(n^3)的代码:
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
char str[maxn];
bool check(char *a, char *b)
{
while(a<b)
{
if(*a==*b)a++,b--;
else break;
}
if(a>=b)return true;
else return false;
}
int getlongeststring(char *a)
{
char *first, *last;
int len=strlen(a);
first=a;
int res=1, slen=0;
while(first<=&a[len-1])
{
last=first+1;
while(last<=&a[len-1])
{
if(check(first, last)){res=(last-first+1)>res?(last-first+1):res;};
last++;
}
first++;
}
return res;
}
int main()
{
gets(str);
int i, j;
int len=getlongeststring(str);
cout<<len<<endl;
}
o(n^2)的代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
char str[maxn];
int getlongest(char*a)
{
char *pchar, *first, *last;
int len=strlen(a);
pchar = a;
int res=0;
while(*pchar!='\0')
{
// printf("%c\n", *pchar);
first=pchar;
last=pchar+1;
while(first>=a && last<=(a+len-1) && *first==*last)
{
first--;
last++;
}
res=(last-first-1)>res?(last-first-1):res;
first=pchar-1;
last=pchar+1;
while(first>=a && last<=(a+len-1) && *first==*last)
{
first--;
last++;
}
res=(last-first+-1)>res?(last-first-1):res;
pchar++;
}
return res;
}
int main()
{
gets(str);
int i, j;
cout<<getlongest(str)<<endl;
}