从上面的图片大家可以大致看出该算法的思想:
第一: 首先取定: str="abcbcbcabc"即原字符串(此时i=0), 而匹配字符串str[j...len-1]=" bcbcbcabc"(即把原来字符串的首字符去掉),此时比较2个字符串的前1个(由j-i决定),看是否匹配,如果匹配则转到第三;否则转到第二;
第二: 不匹配,匹配字符串则缩小为str[j+1....len-1], 比较长度为:n=j-i,看是否匹配,如匹配转第三;否则继续第二;
第三 :匹配,则将匹配字符串缩小为:str[j+n]....len-1],看是否匹配,如果匹配在继续缩小(j+n),否则退出,并记录匹配次数和匹配字符串。
第四:第一轮比较结束后,在i++,即i=1,原字符串str=" bcbcbcabc",即将字母去掉了,然后重复上面的步骤,知道原字符串str="c"(最后一个字符为止).
下面的是具体的代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int count = 0;
char sub_str[256];
void find_str(char *str)
{
int str_len = strlen(str);
int i, j, k;
int tmp_cnt = 0;
for (i = 0; i < str_len; i++)
{
for (j = i+1; j < str_len; j++)
{
int n = j-i; //sub string length
tmp_cnt = 1;
if (strncmp(&str[i], &str[j], n) == 0) //compare n-lengths strings
{
tmp_cnt++; //they are equal, so add count
for (k = j+n; k < str_len; k += n) //consecutive checking
{
if (strncmp(&str[i], &str[k], n) == 0)
{
tmp_cnt++;
}
else
break;
}
if (count < tmp_cnt)
{
count = tmp_cnt;
memcpy(sub_str, &str[i], n); //record the sub string
}
}// if (strncmp(&str[i], &str[j], n) == 0)
}
}
}
int main()
{
char *str = "abcbcbcabc";
find_str(str);
printf("%d, %s\n", count, sub_str);
return 0;
}
不过,本人有两个问题:
第一,为什么在原来字符串不变的情况下,匹配字符串比较的长度: n, 不是从1,2,3,4,....8递增,而是用的是n=j-i??
第二, 为什么在在发现匹配后进一步 缩小时,每次缩小的尺寸为:n,即代码:f
for (k = j+n; k < str_len; k += n)
欢迎各位高手请来指正!!!