有无大佬帮我看看问题出在哪了,看了两三天愣是看不出来,一直查找失败
#include <stdio.h>#include <stdlib.h>
#include <string.h>
void get_next(char * T, int * next)
{
int j = -1;
int i = 0;
next = -1; //-1表示j无路可退
while(i < strlen(T))
{
if(-1 == j || T == T) //T表示后缀单个字符,T表示前缀单个字符
{
++i;
++j;
next = j;
}
else
{
j = next; //若字符串不同,则j值后退
}
}
}
//返回子串T在主串S第pos个字符之后的位置,若不存在,则返回0
int Index_KMP(char * S, char * T, int pos)
{
int i = pos; //i为主串S当前位置下标
int j = 0; //j为子串T当前位置下标
int next;
get_next(T, next); //得到T的next数组
while((i <= strlen(S)) && (j <= strlen(T)))
{
if(-1 == j || S == T) //两字符相等则继续比较
{
i++;
j++;
}
else //若不相等,则i不后退,j后退到合适的位置
{
j = next;
}
}
if(j == strlen(T))
{
return (i-strlen(T));
}
else
{
return -1;
}
}
int main(void)
{
int index;
int pos = 0;
char *s = "ababcabcacbab";
char *t = "abcac";
index = Index_KMP(s, t, pos);
if(-1 == index)
printf("查找失败!");
else
printf("目标位于%d\n", index);
return 0;
} get_next()函数完全不能达到你想要的目的:返回子串T在主串S第pos个字符之后的位置,函数里有S吗?S都没有怎么可能得到位置,其次就是循环,要建立能够扫描到整个数组的循环,而且你还要把T数组的所有字符的位置都检查出来,,,总之你的这个get_next()函数特乱,我是看不下去。。。建议不要想的太复杂,最好从一个一个字符来。。。打个比方。。。
void main()
{
int i=0, j=0;
char q[] = {"qwer"};
char w[] = {"qw"};
for (i = 0; i < sizeof(q); i++,j++)
{
if (q == w)
{
printf("%d\n",i);
}
}
}
输出是0,1; 绊axs 发表于 2018-11-12 18:30
get_next()函数完全不能达到你想要的目的:返回子串T在主串S第pos个字符之后的位置,函数里有S吗?S都没有 ...
我这个例子不是很好,参考一下就好啦
页:
[1]