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;
}
分享到:
相关推荐
后缀数组的概念源于1990年代,由Udi Manber首次提出,其核心思想是将一个字符串的所有后缀按照字典序排序,然后存储这些后缀的起始位置。 后缀数组的构建方法主要有两种:线性时间复杂度的Manber-Myers算法和基于-...
此外,结合其他数据结构,如最小覆盖集(LCP数组)或后缀树,后缀数组可以进一步解决更复杂的字符串问题,如计算最长公共子串、最长回文子串等。 附件3中的源程序可能包含了实现这些算法的C++或Python代码,这对于...
在比较两个字符串时,后缀数组可以帮助我们快速找到它们之间的最长公共子串,以及计算长度不小于k的公共子串的个数等。 2.4 多个字符串的相关问题 在信息学竞赛或实际应用中,可能需要对多个字符串进行分析,此时...
在编程领域,最长公共子串(Longest Common Substring,LCS)问题是一个经典的问题,它寻找两个或多个字符串中的最长连续子序列,这个子序列同时存在于所有字符串中。在这个问题中,我们专注于PHP如何解决两个字符串...
6. **两个或多个字符串的相关问题**:如最长公共子串、长度不小于k的公共子串的个数等,后缀数组可以处理多字符串之间的关系。 后缀数组在信息学竞赛和实际编程中有着广泛的应用,它简化了许多原本复杂的字符串处理...
总结来说,后缀数组是字符串处理中的一个重要工具,它通过DC3等算法能在线性时间内构建,并能有效地解决诸如最长公共子串等问题。在互联网领域,这样的数据结构对于文本检索、搜索引擎优化、生物信息学中的DNA序列...
后缀数组是字符串处理中的一个重要概念,由Michael R. Garey和David S. Johnson在1975年首次提出,但真正流行起来是由于它的高效性和广泛应用。它是一种能够快速解决许多字符串问题的数据结构,如查找最长重复子串、...
6. **两个字符串的相关问题**:如最长公共子串的查找和长度不小于k的公共子串的个数。 7. **多个字符串的相关问题**:涵盖多个字符串中的最长子串,以及满足特定条件的子串等。 总结来说,后缀数组是一个强大且灵活...
2. **最小覆盖子串(Minimum Unique Substring Cover)**:利用后缀数组可以找到一个字符串的最小覆盖子串集合,使得每个字符都至少被覆盖一次。 在ACM竞赛中,熟练掌握后缀数组及其应用技巧是必不可少的,它能帮助...
以下是一个Python函数`getNumofCommonSubstr`,用于找到两个字符串的最长公共子串及其长度: ```python def getNumofCommonSubstr(str1, str2): lstr1 = len(str1) lstr2 = len(str2) record = [[0 for _ in ...
后缀数组是指一个字符串的所有后缀的排序结果。其中,SA[i] 保存的是字符串所有的后缀中第 i 小的后缀的开头位置。例如,对于字符串“aabaaaab”,其后缀数组为: SA[0] = 7 (最后一个后缀“b”) SA[1] = 6 (后缀...
后缀数组是一种在字符串处理中极其重要的数据结构,由许智磊在IOI2004国家集训队论文中介绍。它是一个一维数组,包含字符串的所有后缀按照字典顺序排序后的起始索引。后缀数组的构建是通过特定算法实现的,如O(nlogn...
后缀数组能够提供一种高效的方式来存储和查询字符串的后缀,这使得它成为解决许多字符串问题的有效工具,例如查找模式匹配、最短重复子串、最长公共前后缀等问题。 首先,我们要明确后缀数组的定义。对于一个字符串...
后缀数组是字符串处理中的一个重要数据结构,尤其在算法竞赛(如OI)和文本处理领域广泛应用。罗穗骞,可能是某位知名的OI教练或专家,提供了关于后缀数组的源码和相关题目,帮助学习者深入理解这一概念。 后缀数组...
- 可以通过后缀数组和LCP数组在O(nlogn)的时间复杂度内找到给定字符串中的最长回文子串。 - 首先构建后缀数组和LCP数组,然后分析LCP数组中的最大值即可找到最长回文子串的位置。 #### 六、总结 后缀数组作为字符串...
题目要求编写一个C++程序来找到两个给定字符串中的最长公共子串。例如,对于字符串`a="abcrrrerads"`和字符串`b="afdabcssbcrrresswrds"`,最长公共子串为`"bcrrre"`。 #### 三、算法原理 本程序采用了一个简单的...
【POJ 2774】要求求出两个字符串的最长公共子串,这可以通过后缀数组和LCP(Longest Common Prefix,最长公共前后缀)数组直接计算得出。 【POJ 3693】的问题更复杂一些,需要找出字符串中重复次数最多的连续重复子...