码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-08-02 16:25:27      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

利用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,Im Adam.
Madam,Im Adam

 

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

标签:

原文地址:http://www.cnblogs.com/hanahimi/p/4695760.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!