输入一个字符串,求出其中最长的回文子串。
子串的含义是:在原串中连续出现的字符串片段。
回文的含义是:正着看和倒着看相同,如abba, yyxyy。
判断字符串是否是一条回文串:
(Java:)
public static boolean isPalindrome(String s)
{
int N = s.length();
for(int I = 0; I <= N/2; I++)
if(s.charAt(I) != s.charAt(N-1-i)
return false;
return true;
}
(C):
bool IsPalindrome(const char *s, int n)
{
//非法输入
if(s == NULL || n < 1)
return false;
const char* front, *back;
//初始化头指针和尾指针
front = s;
back = s + n - 1;
while(front < back)
{
if(*front < *back)
return false;
++front;
--back;
}
return ture;
}
这个实现直白且效率不错,时间复杂度为O(n),空间复杂度为O(1)。
最长回文子串:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 5000 + 10
char buf[MAXN], s[MAXN];
int main()
{
int n;
int m = 0;
int max = 0;
int i, j ,k;
fgets(buf, sizeof(s), stdin);
//一次性读取一整行
n = strlen(buf);
for(i=0; i<n; i++)
if(isalpha(buf[i])) s[m++] = toupper(buf[i]);
//预处理,构造新字符串,不包含标点,将字符变大写
for(i=0; i<m; i++)
for(j=i; j<m; j++)
{
int ok = 1;
for(k=i; k<=j; k++)
{
if(s[k] != s[i+j-k]) //判断回文串
ok = 0;
}
if(ok && j-i+1 > max)
max = j-i+1;
}
//返回最长回文串的长度
printf("max = %d\n", max);
return 0;
}
上面的代码可以求出样例程序中的最长回文串的长度,还剩下一个问题是:原样输出。
增加一个数组p,用p[i]保存s[i]在buf中的位置。它可以很容易地在预处理中得到;然后在更新max同时把p[i]和p[j]保存到x和y,最后输出buf[x]和buf[y]中的所有字符。效率低。
换一种方式:
中心扩展法——枚举回文串的“中间”位置i, 然后不断往外扩展,直到有字符不同。(长度奇数和偶数的处理方式是不一样的)
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 5000 + 10
char buf[MAXN], s[MAXN];
int p[MAXN];
int main()
{
int n, x, y;
int m =0;
int max = 0;
int i, j;
fgets(buf, sizeof(s), stdin);
n = strlen(buf);
for(i=0; i<n; i++)
if(isalpha(buf[i]))
{
p[m] = i;
s[m++] = toupper(buf[i]);
}
//I为回文的中心位置
for(i=0; i<m; i++)
{
//回文长度为奇数
for(j=0; i-j>=0 && i+j<m; j++)
{
if(s[i-j] != s[i+j]) break;
if(j*2+1 > max)
{
max = j*2+1;
x = p[i-j];
y = p[i+j];
}
}
//回文长度为偶数
for(j=0; i-j>=0 && i+j+1<m; j++)
{
if(s[i-j] != s[i-j+1]) break;
if(j*2+2 > max)
{
max = j*2+2;
x = p[i-j];
y = p[i+j];
}
}
}
//返回最长回文串的长度
printf("max = %d\n", max);
//返回最长回文串
for(i=x; i<=y; i++)
printf("%c", buf[i]);
printf("\n");
return 0;
}
本文介绍了一种寻找字符串中最长回文子串的方法,并提供了两种实现思路:暴力枚举和中心扩展法。通过这两种方法,不仅可以找出最长回文子串的长度,还可以输出具体的回文子串。
5180

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



