标签:
利用C语言实现的最长回文子串算法
1 # include<stdio.h>
2 # include<string.h>
3 # include<ctype.h>
4
5 # define MAXN 5000 + 10
6 char buf[MAXN], s[MAXN]; //buf输入字符串, s去掉标点空格并转为大写的预处理字符串
7 int p[MAXN]; // p用于记录处理后字符串s中,每个字符在原字符串buf中的序号
8 int main(){
9
10 int n, m = 0, max = 0, x, y;
11 int i, j;
12 fgets(buf, sizeof(s), stdin);
13 n = strlen(buf);
14
15 for(i=0;i<n;i++)
16 if(isalpha(buf[i])){
17 p[m] += i;
18 s[m++] = toupper(buf[i]);
19 }
20 // 不断找出新的回文中点 i ,在i点处往左右扩展,
21 // 从内而外判断离 i 距离为 j处的字符是否相等
22 // 即可判断当前以 i 为中点的扩展子串是否为回文
23 for(i=0;i<m;i++){
24
25 # 子串长度为奇数
26 for(j=0; j <= i && i < m-j; j++){
27 if(s[i-j] != s[i+j]) break;
28 if(j*2+1 > max) { max = j*2+1; x = p[i-j]; y = p[i+j];}
29 }
30 # 子串长度为偶数
31 for(j=0;j<=i && i+1<m-j;j++){
32 if(s[i-j]!=s[i+j+1]) break;
33 if(j*2+2>max){max = j*2+2; x = p[i-j]; y = p[i+j+1];}
34 }
35 }
36 for(i=x;i<=y;i++)
37 printf("%c",buf[i]);
38 printf("\n");
39
40 return 0;
41 }
测试输入:
[hanahimi@localhost C]$ ./a.out Confuciuss say:Madam,I‘m Adam. Madam,I‘m Adam
标签:
原文地址:http://www.cnblogs.com/hanahimi/p/4695760.html