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;
}
分享到:
相关推荐
后缀数组((处理字符串的有力工具)),后缀数组((处理字符串的有力工具))
罗穗骞《后缀数组——处理字符串的有力工具》(有算法源码和解题源码) IOI2009论文,有源码,简单易懂,方便学习后缀数组的构造和各种应用。...后缀数组是一种优秀的数据结构,在字符串匹配方面有诸多应用。
后缀数组——处理字符串的有力工具,国家集训队论文
基于压缩后缀数组实现的一个字符串搜索库,用压缩后缀数组算法实现了一个简单核心的搜索开源库,可以扩展。
摘要】后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后
后缀数组——处理字符串的有力工具_罗穗骞.ppt
后缀数组这个东西真的是神仙操作…… 但是这个比较神仙的东西在网上的讲解一般都仅限于思想而不是代码,而且这个东西开一堆数组,很多初学者写代码...笔者自己也是和后缀数组硬刚了一个上午外加一个中午才理解的板子。
后缀数组 笔记 后缀数组——处理字符串的有力工具 罗穗骞 后缀数组——处理字符串的有力工具 PPT 后缀数组--许智磊 后缀数组--许智磊 PPT
后缀数组的倍增算法和DC3算法的实现以及不可重叠重复子串的问题,很详细的资料
罗穗骞《后缀数组——处理字符串的有力工具》(有算法源码和解题源码) IOI2009论文,有源码,简单易懂,方便学习后缀数组的构造和各种应用。...后缀数组是一种优秀的数据结构,在字符串匹配方面有诸多应用。
树状数组 后缀数组 字典树 多串匹配算法及启示
后缀数组 一个处理字符串的利器 适合有一些数据结构基础的读者
摘要】后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后
后缀数组——处理字符串的有力工具.ppt
摘要】后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后
后缀数组的应用受到越来越多人的关注,本文详细介绍了后缀数组的基本原理以及LCP—最长公共前缀。最后给出了几道例题及解析。
使用的是visual studio开发平台,使用说明在压缩包中。其功能是用以求字符串的前缀后缀和子串,里面包含数组去重、一个数组与另一个数组对比去重等算法的基础版,有简单的图形界面窗口,输入数据点击按钮实现功能。
比较完整地介绍了后缀数组的概念,用法,解决了诸如最长回文串,最长公共子序列的问题,很值得一看