| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1446 人关注过本帖
标题:求最长重复字串
只看楼主 加入收藏
xinjinlong
Rank: 3Rank: 3
来 自:河南南阳
等 级:论坛游侠
帖 子:61
专家分:117
注 册:2010-1-19
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
求最长重复字串
一个长度为10000的字符串,写一个算法,找出最长的重复子串,如abczzacbca,结果是bc。
搜索更多相关主题的帖子: 字串 
2010-03-09 21:57
qingxin111
Rank: 2
等 级:论坛游民
帖 子:71
专家分:29
注 册:2008-4-10
收藏
得分:3 
#include <stdio.h>
#include <string.h>

char str[100];
char ch[10];

void insert(int start,char *ch,int size);

void main(){
    int num=0;
    int StartFirst=0,StartSecond=0,TempWordSize,WordSize=0;
    printf("Please input :");
    gets(str);
    for(char *Str=str;*Str!='\0';num++,Str++)
        ;
    for(;(StartFirst+2*WordSize+1)<num;StartFirst++){
        StartSecond=StartFirst+WordSize+1;
        for(;(StartSecond+WordSize)<=num;StartSecond++){
            TempWordSize=0;
            for(;str[StartFirst+TempWordSize]==str[StartSecond+TempWordSize]&&StartFirst+TempWordSize<StartSecond;TempWordSize++)
                ;
            if(TempWordSize>=WordSize){
                WordSize=TempWordSize;
                insert(StartFirst,ch,WordSize);
            }
        }
    }
    if(WordSize==0)
        printf("NO\n");
    else{
        printf("%d\n",WordSize);
        puts(ch);
    }
}

void insert(int start,char *ch,int size){
    for(int num=0;num<size;num++,start++,ch++)
        *ch=*(str+start);
}
最笨的方法~~
不知道大侠们有没有什么更好的办法,拿出来分享一下嘛~
2010-03-10 11:28
江河
Rank: 1
等 级:新手上路
帖 子:6
专家分:8
注 册:2010-3-9
收藏
得分:3 
看的头疼 说下你的思路就可以了
2010-03-10 11:36
陈大师
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:231
专家分:1038
注 册:2009-11-4
收藏
得分:3 
2楼的效率比较低 如果利用后缀数组实现,o(nlogn)~~~~ 就能实现了·····详细可以见下面的链接··

http://blog.

据说o(n)就可以搞定。。。有难度!期待高手出现····
2010-03-10 11:58
mywaylgh
Rank: 8Rank: 8
来 自:厨房
等 级:蝙蝠侠
威 望:5
帖 子:188
专家分:729
注 册:2010-3-10
收藏
得分:3 
同样期待

人生就像茶几 上面放着许多杯具

人生也像厨房 里面总有一些洗具
2010-03-10 13:45
mywaylgh
Rank: 8Rank: 8
来 自:厨房
等 级:蝙蝠侠
威 望:5
帖 子:188
专家分:729
注 册:2010-3-10
收藏
得分:0 
可以用动态规划法实现,效率很好

参看 生物领域的 blast 的实现方法

人生就像茶几 上面放着许多杯具

人生也像厨房 里面总有一些洗具
2010-03-10 18:13
mywaylgh
Rank: 8Rank: 8
来 自:厨房
等 级:蝙蝠侠
威 望:5
帖 子:188
专家分:729
注 册:2010-3-10
收藏
得分:0 
中午有时间写了一下这个程序,是我想到的效率最高的一种了(也就是前面说的blast的算法)

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MIN(a,b) (a>b?b:a)
#define MAXCHAR 10000
int main (int argc,char **argv)
{
    char *c = (char *)malloc(MAXCHAR*sizeof(char));
    char *bestchar;
    int bestmatch[2]={0,0};
    int beststep,step,maxstep;
    int i,j;
    int len;

    printf("Pleas input the string:\n");
    gets(c);
    len = strlen(c);

    //get best match
    for (i=0;i<len ;i++ )
        for (j=i+1;j<len ;j++ )
        {
            if (c[i] == c[j])
            {
                step = 1;
                maxstep = MIN(len-i,len-j);

                while(step<maxstep && c[i+step]==c[j+step]) step++;
   
                if (bestmatch[1]<step)
                {
                    bestmatch[0] = i;
                    bestmatch[1] = step;
                }
            }
        }

    //copy best match to bestchar
    bestchar = (char *)malloc(bestmatch[1]*sizeof(char));
    for (i=0;i<bestmatch[1] ;i++ ) bestchar[i] = c[i+bestmatch[0]];
    bestchar[i]='\0';

    printf("The longest copied string is %s\n",bestchar);

    free(bestchar);
    free(c);
}

应该可以结题了


人生就像茶几 上面放着许多杯具

人生也像厨房 里面总有一些洗具
2010-03-11 13:39
快速回复:求最长重复字串
数据加载中...
 
   



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

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