题目:给定一个字符串,求字符串中长度大于3的重复出现的子串。如“abcdeabcdfg”,长度大于3且重复出现的子串为abcd.
解:使用后缀数组,把字符串的后缀进行排序,然后逐个比较相邻两个后缀,如果共同的长度大于3,则输出这个子串。
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
int main()
{
int com(char a[],char b[]);
void fun(char a[]);
char a[50]="hello world hell wor";
fun(a);
system("pause");
return 0;
}
int cmp(const void *a,const void *b)
{
return strcmp(*((char * const* )a),*((char *const *)b));
}
int com(char a[],char b[]) //计算公共长度
{
char *p=a;
char *q=b;
int i=0;
while((*p==*q)&&(*p!=‘\0‘))
{
i++;
p++;
q++;
}
return i;
}
void fun(char a[])
{
int i=0;
int max=0;
int maxi=0;
int len=strlen(a);
char *b[20]; //b为后缀数组
for(i=0;i<len;i++)
{
b[i]=&a[i];
}
qsort(b,len,sizeof(char *),cmp); //快速排序
for(i=0;i<len-1;i++)
{
if(com(b[i],b[i+1])>3)
{
printf("%.*s\n",com(b[i],b[i+1]),b[i]);
}
}
}原文:http://blog.csdn.net/u011608357/article/details/24530715