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
算法分析:由于数据比较小,采用穷举算法,还可以用动态规划。
1. 对于字符串中的每个字符的下标s[i],首先考虑s[i]是否等于s[i - 1],如果相等则继续比较s[i - 2]和s[i + 1];
2. 然后考虑s[i - 1]是否等于s[i + 1],如果相等则继续比较s[i - 2]和s[i + 2];
3. 在进行比较的同时还要更新回文串的长度。
这里举出一种动态规划算法,但是感觉计算复杂度都一样为 O(n2) 。传送门。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i, maxlen = 1;
char s[1001] = { '\0' };
gets(s);
int len = strlen(s);
for (i = 1; i < len; i++)
{
int front, tail, cl = 0;
if (s[i] == s[i - 1])
{
cl = 0;
//比较s[i-1]和s[i]
for (front = i - 1, tail = i; front >= 0 && tail < len; front--, tail++)
if (s[front] == s[tail])
cl += 2;
else
break;
}
else if (s[i - 1] == s[i + 1])
{
cl = 1; //注意这里初值为1
//比较s[i-1]和s[i+1]
for(front = i - 1, tail = i + 1; front >= 0 && tail < len; front--, tail++)
if (s[front] == s[tail])
cl += 2;
else
break;
}
if (cl > maxlen)
maxlen = cl;
}
printf("%d\n", maxlen);
system("pause");
return 0;
}
本文介绍了一种求解最长回文子串的算法实现,通过遍历字符串并检查潜在的回文序列来找到最长的回文子串。文章提供了一个具体的C语言实现示例,并解释了其工作原理。
1705

被折叠的 条评论
为什么被折叠?



