| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5854 人关注过本帖, 1 人收藏
标题:求助:最长回文子串
取消只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏(1)
已结贴  问题点数:100 回复次数:2 
求助:最长回文子串

例如:在字符串abacbaabcccccbae 中,最长回文子串为:bcccccb 试着编写程序求一个字符串中的最长回文子串。

我贴个自己写的最长重复子串,利用后缀数组
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXCHAR 5000 //最长处理5000个字符
char c[MAXCHAR], *a[MAXCHAR];
int comlen( char *p, char *q ){
    int i = 0;
    while( *p && (*p++ == *q++) )
        ++i;
    return i;
}
int pstrcmp( const void *p1, const void *p2 ){
    return strcmp( *(char* const *)p1, *(char* const*)p2 );
}
int main(  ){
    char ch;
    int  n=0;
    int  i, temp;
    int  maxlen=0, maxi=0;
    printf("Please input your string:\n");
    while( (ch=getchar())!='\n' ){
        a[n]=&c[n];
        c[n++]=ch;
    }
    c[n]='\0';
    qsort( a, n, sizeof(char*), pstrcmp );
    for(i=0; i<n-1; ++i ){
        temp=comlen( a[i], a[i+1] );
        if( temp>maxlen ){
            maxlen=temp;
            maxi=i;
        }
    }
    printf("%.*s\n",maxlen, a[maxi]);
    system("PAUSE");
    return 0;
}
解题思路:
  对于类似从给定的文本中,查找其中最长的重复子字符串的问题,可以采用“后缀数组”

来高效地完成此任务。后缀数组使用文本本身和n个附加指针(与文本数组相应的指针数组)
来表示输入文本中的n个字符的每个子字符串。
第一,构造后缀指针数组:a[n]=&c[n];
例如:输入字符串为"banana",该数组将表示这些后缀:
 a[0]:banana
 a[1]:anana
 a[2]:nana
 a[3]:ana
 a[4]:na
 a[5]:a
第二,快速排序:qsort( a, n, sizeof(char*), pstrcmp );
经过快速排序后数组a如下:
 a[0]:a
 a[1]:ana
 a[2]:anana
 a[3]:banana
 a[4]:na
 a[5]:nana
第三,使用以下comlen函数对数组进行扫描比较邻接元素,以找出最长重复的字符串,输入:
printf("%.*s\n",maxlen, a[maxi]);

请教各位高手,如何做出?
搜索更多相关主题的帖子: 回文 
2010-12-09 19:55
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
顶上去,应该枚举没问题吧

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-12-12 11:04
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXN 5000
char buf[MAXN],s[MAXN];
int p[MAXN];
int main()
{
  int n,m=0,max=0,x,y;
  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[i]在buf中的位置
   s[m++]=toupper(buf[i]);  //全部转化为大写以便判断是否回文
   }
   for(i=0;i<m;i++)
   {
   //长度为奇数的回文子串 duaud
   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];}//跟新max的同时把p[i]和p[j]保存到x,y
   }
   //长度为偶数的回文子串
    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+1;x=p[i-j];y=p[i+j+1];}
   }
   }
   for(i=x;i<=y;i++)
     printf("%c",buf[i]);
     printf("\n");
   system("pause");
    return 0;
}
终于找到了刘汝佳写的最长回文子串了:

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-12-12 19:37
快速回复:求助:最长回文子串
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013088 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved