章鱼张 发表于 2018-11-12 15:14:22

有无大佬帮我看看问题出在哪了,看了两三天愣是看不出来,一直查找失败

#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;

}

绊axs 发表于 2018-11-12 18:30:18

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:32:35

绊axs 发表于 2018-11-12 18:30
get_next()函数完全不能达到你想要的目的:返回子串T在主串S第pos个字符之后的位置,函数里有S吗?S都没有 ...

我这个例子不是很好,参考一下就好啦
页: [1]
查看完整版本: 有无大佬帮我看看问题出在哪了,看了两三天愣是看不出来,一直查找失败