注意此处说的是重复的最长子串,只要出现重复就好,没说重复的次数。
下面给出的代码是编程珠玑中给出的一种实现。
他是通过后缀数组的方式实现的。
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
using namespace std;
int comlen(char*p, char*q)//找出公共的最长子串
{
int i = 0;
if (p == NULL || q == NULL)
return 0;
while ( (*p++ == *q++))
i++;
return i;
}
int pstrcmp(const void*a, const void*b)
{
return strcmp(*(char**)(a),*(char**)(b));
}
int main()
{
char* s = "abcdabce";
char* a[8];//指针后缀数组
for (int i = 0;; i++)
{
if (s[i] == 0)
break;
a[i] = &s[i];//指针后缀数组赋值
}
qsort(a, 8, sizeof(char*), pstrcmp);
int maxlen = 0,maxi=0;
for (int i = 0; i < 7; i++)//找出相邻的最大子串
if (comlen(a[i], a[i + 1])>maxlen)
{
maxlen = comlen(a[i], a[i + 1]);
maxi = i;
}
printf("%.*s\n", maxlen, a[maxi]);
}int pstrcmp(const void*a, const void*b)
{
return strcmp(*(char**)(a),*(char**)(b));//注意此处的char**而不是char*
}原文:http://blog.csdn.net/zhouyelihua/article/details/46496747