`
kmplayer
  • 浏览: 496444 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用后缀数组返回一个字符串的最长公共子串

阅读更多
1,基本思想:
排序后缀数组,两两比较即可.
2,实例代码:
#include <iostream>
#include <algorithm>
using namespace std;

//返回公共前缀的数目
int comlen(const char *p, const char *q)
{
    int i = 0;
	while (*p && (*p++ == *q++))
		i++;
	return i;
}

const int MAXN=5000000;
const char* a[MAXN]; //存放后缀数组

char* getMaxCommonStr(const char* str)
{
    int n = 0, maxi, maxlen = -1;
    while (*str)
    {
        a[n++] = str++;
    }
    //a得到所有的后缀数组
    //对其进行排序
    sort(a,a+n,less<string>());
    for (int i = 0; i < n-1; i++)
        cout<<a[i]<<endl;

    for (int i = 0; i < n-1; i++)
    {
        int tmpComLen=comlen(a[i], a[i+1]);
        if (tmpComLen > maxlen)
        {
            maxlen = tmpComLen;
            maxi = i;
        }
    }
    char* maxCommonStr=(char*)malloc(maxlen+1);
    strncpy(maxCommonStr,a[maxi],maxlen);
    return maxCommonStr;

}

int main()
{
    //freopen("genetic.txt","r",stdin);
    cout<<"后缀数组排序:"<<endl;
    char* re=getMaxCommonStr("abceabcedabcedfbceabcedabcedf");

    cout<<"最长公共子串:"<<endl;
    cout<<re<<endl;

    free(re);
    return 0;
}


3,给出一段c语言的实现.
注:qsort的使用.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef int (*comp)(const void*, const void*);
int pstrcmp(char **p, char **q)
{
    return strcmp(*p, *q);
}

//返回前缀的数目
int comlen(char *p, char *q)
{
    int i = 0;
	while (*p && (*p++ == *q++))
		i++;
	return i;
}

#define MAXN 5000000
char c[MAXN], *a[MAXN];

int main()
{
    //freopen("genetic.txt","r",stdin);
    int i, n = 0, maxi, maxlen = -1;
    char* c="abceabcedabcedfbceabcedabcedf";
    while (*c)
    {
        a[n++] = c;
        c++;
    }
    qsort(a, n, sizeof(char *), (comp)pstrcmp);
    for (i = 0; i < n-1; i++)
        printf("%s\n", a[i]);

    for (i = 0; i < n-1; i++)
        if (comlen(a[i], a[i+1]) > maxlen)
        {
            maxlen = comlen(a[i], a[i+1]);
            maxi = i;
        }
    printf("公共子串:\n");
    printf("%.*s\n", maxlen, a[maxi]);
    return 0;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics