算法学习笔记——判断最小回文子串

利用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

 

posted on 2015-08-02 14:49  hanahimi  阅读(316)  评论(0)    收藏  举报

导航