#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
//字符串按字典序排序
int cmp(const void *a, const void *b)
{
return strcmp(*(char **)a, *(char **)b);
}
/*返回两段字符串重复的长度*/
int cmpLen(char *s1,char *s2)
{
int i = 0;
while (s1[i]!='\0'&&s2[i]!='\0' && s1[i]==s2[i])
{
i++;
}
return i;
}
//获取后缀字符串数组
char **SuffixString(char *s)
{
int len = strlen(s);
char **ret = malloc(sizeof(char *)*len); //保存后缀指针
for (int i = 0; i < len; i++)
{
ret[i] = s + i;
}
return ret;
}
//返回最长重复子子串
char* maxIterateString(char *s)
{
int len = strlen(s);
char *ret = malloc(sizeof(char)*(len + 1));
int maxLen = 0;
char **suffixBuffer = SuffixString(s);
qsort(suffixBuffer, len, sizeof(char *), cmp); //对后缀字符串进行排序
for (int i = 0; i < len - 1; i++)
{
int tempLen = 0;
if ((tempLen =cmpLen(suffixBuffer[i], suffixBuffer[i + 1])) > maxLen) //若重复子串更长则更新
{
maxLen = tempLen;
memcpy(ret, suffixBuffer[i], sizeof(char)*maxLen);
}
}
ret[maxLen] = '\0';
free(suffixBuffer);
return ret;
}
int main()
{
char str[100] = "";
gets(str);
char *temp = maxIterateString(str);
puts(temp);
free(temp);
system("pause");
return 0;
}
参考:https://blog.csdn.net/renwotao2009/article/details/53039068