******************************************************************************
第一种解法:
******************************************************************************
比如 输入qweabcuwabcfw,输出结果为3 第二次出现abc的 a的地址。//不用查找函数
int maxsubstr(char* src,char** p)
{
char *sztmp = src;
char *tmp = NULL; //临时字符串,如ca,ab,等
int i, j, k; //用于循环
int max_len = 1, count = 0, ipos = 0;
//统计字符串长度,统计重复次数,统计位置
int len; //字符串长度
if (sztmp == NULL||(len = strlen(sztmp))==0){//判断源字符串是否合格
return -1;
}
tmp = (char*)malloc(sizeof(char)*len+1);
memset(tmp,0,len+1);
for (i=1;i<len;i++){//获取字符长度
for (j=0;j<len-i-1;j++){//截取源字符串中i长度的字符串
strncpy(tmp,sztmp+j,i+1);
for (k=0,count=0;k<len-i;k++){
//循环比较字符串,如有重复字符串,并且最长的记录下搜索来
if (strncmp((sztmp+k),tmp,i+1)==0){
count++;
if (count != 1){
if (i >= max_len){
max_len = i+1;
ipos = k;
}
}
}
}
}
}
free(tmp);
*p = sztmp + ipos;
return max_len;
}
int main(){
char* p = NULL;
int n = maxsubstr("qwiohiuweowohifpw",&p);
printf("%d\n %p\n", n, &p);
}
******************************************************************************
第二种解法:
******************************************************************************
思路:使用后缀数组,对一个字符串生成相应的后缀数组后,然后再排序,排完序依次检测相邻的两个字符串的开头公共部分。