#include <iostream>
#include <string>
using namespace std;
#define MAXLEN 100
char* arr[MAXLEN]; //后缀数组
int start = 0; //最长重复子串所在的后缀数组的元素下标
int maxLen = -1; //子串长度
int comLen(char* p, char* q) //求两个字符串的公共前缀长度
{
int len = 0;
while(*p && *q && *p++ == *q++)
len++;
return len;
}
int pstrcmp(const void* p, const void* q) //字符串排序的比较函数
{
return strcmp(*(char**)p, *(char**)q); //由于字符串数组每个元素是指针,所以要传递指针的地址比较,强转为**,strcmp的参数是指针,所以还要解一级指针
}
void LongestRepeatSubstring(char* str, int n) //目标字符串,长度
{
for (int i = 0; i < n; i++) //后缀数组初始化
{
arr[i] = &str[i];
}
qsort(arr, n, sizeof(char*), pstrcmp); //后缀数组排序
for (int i = 0; i < n-1; i++) //求最长重复子串
{
int len = comLen(arr[i], arr[i+1]); //比较相邻后缀数组元素
if (len > maxLen)
{
maxLen = len;
start = i;
}
}
for (int i = 0; i < maxLen; i++) //输出结果
{
printf("%c", arr[start][i]);
}
printf("\n");
}
int main()
{
char str[7] = "banana";
int len = strlen(str);
LongestRepeatSubstring(str, len);
return 0;
}
后缀数组求最长重复子串(可重叠的)
最新推荐文章于 2021-02-12 20:15:27 发布