int con_sub(char *str,char *ret) { int max_len=0;//记录最大长度 int temp_len=1; int len=strlen(str); char** next=(char**)malloc(sizeof(char *)*len); for (int i=0;i<len;i++)//后缀数组 { next[i]=str+i; } for (int k=1;k<(len+1)/2;k++)//相等大小不会大于一半,相等大小的控制 { for (int i=0;i<len-1;i++)//从头开始比较,控制第i个子串与后面的比较 { temp_len=1; for (int j=0;i+k+j<=len-1;j++)//用于比较不相邻的字串是否相等,控制后面被比较的子串 { if (strncmp(next[i],next[i+k+j],k)==0)//跨度为k进行比较前k个字符,找到一个相等的,立即进入下一个k值比较,如果不等next[i+k+j]往下移动一位,由j控制 { temp_len=k; break; } } if (temp_len>max_len) { max_len=temp_len; strncpy(ret,str+i,max_len);//把最大的重复字符串保存起来 break; } } } return max_len; }