鱼C论坛

 找回密码
 立即注册
查看: 2646|回复: 2

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

[复制链接]
发表于 2018-11-12 15:14:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void get_next(char * T, int * next)
{
    int j = -1;
    int i = 0;

    next[0] = -1;                                           //-1表示j无路可退

    while(i < strlen(T))
    {
        if(-1 == j || T[i] == T[j])                         //T[i]表示后缀单个字符,T[j]表示前缀单个字符
        {
            ++i;
            ++j;
            next[i] = j;
        }
        else
        {
            j = next[j];                                    //若字符串不同,则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[255];

    get_next(T, next);                                              //得到T的next数组

    while((i <= strlen(S)) && (j <= strlen(T)))
    {
        if(-1 == j || S[i] == T[j])                                  //两字符相等则继续比较
        {
            i++;
            j++;
        }
        else                                                        //若不相等,则i不后退,j后退到合适的位置
        {
            j = next[j];
        }
    }

    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;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i] == w[j])
                {
                        printf("%d\n",i);
                }
        }
}

输出是0,1;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我这个例子不是很好,参考一下就好啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 02:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表