题目:给定一个字符串,求字符串中长度大于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