| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 411 人关注过本帖
标题:KMP算法中一处不明白的地方
只看楼主 加入收藏
wqwqyt123
Rank: 2
等 级:论坛游民
帖 子:30
专家分:52
注 册:2015-1-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
KMP算法中一处不明白的地方
#include <stdio.h>
#include <string.h>
void KMP(char *p , int *next)
{
    int length;          //模式串长度
    int j=0;            //next数组的下标   
    int k=-1;           //next数组下标的值
    length = strlen(p);
    next[0]=-1;
    while( j< length)     //next数组赋值
    {
        if (k == -1 || p[j] == p[k])      
        {
            j++;
            k++;
            if ( p[j] != p[k])
                next[j]=k;
            else
                next[j]=next[k];
        }
        else
            k=next[k];                //  这里想不通,为什么不直接  k=-1呢?  
    }   
}
int main()
{   
    char text[30];
    char pattern[30];
    int next[30];
    int i=0,j=0;                // i为文本串数组下标,j为模式串下标
   
    printf("请输入文本串");
    scanf("%s",text);
    printf("请输入模式串");
    scanf("%s",pattern);
   
    KMP(pattern,next);                  //获取next数组
   
    int textlength,patternlength;   
    textlength = strlen(text);
    patternlength = strlen(pattern);
   
    while(i <= (textlength-patternlength) )
    {
        while(j==-1 || (pattern[j] == text[i] && pattern[j]!='\0'))
        {
            i++;
            j++;
        }
        if(j == patternlength)
        {
            printf("success");
            return 0;
        }
        
        j=next[j];
        
    }
    printf("failed");
    return 0;
}


next数组不是比较 0~k-1  和 (j-k)~(j-1)  的字符是否相同吗?

那不同后为什么不直接把k返回-1,而是k=next[k]?

能不能举个例子使用k=-1后与使用k=next[k]后的next数组不同?谢谢了

[ 本帖最后由 wqwqyt123 于 2015-7-6 22:28 编辑 ]
搜索更多相关主题的帖子: include 
2015-07-06 13:51
实际应用
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:89
专家分:341
注 册:2015-5-30
收藏
得分:20 
那段有问题,所以一直是-1
改正后,就是可变化的,是1,2,3。。。
2015-07-06 22:00
wqwqyt123
Rank: 2
等 级:论坛游民
帖 子:30
专家分:52
注 册:2015-1-2
收藏
得分:0 
回复 2楼 实际应用
额,虽然看不懂你在说什么。。但我实在受不了不懂这玩意,自己想了一个挺长的模式串自己分析,懂了
ababc ababd ababc ababc g


  k= -1  0  0  1  2  0  1  2  3  4
  j=  0  1  2  3  4  5  6  7  8  9
  k=    -1       -1             (2->-1)

      a  b  a  b  c  a  b  a  b  d

next  -1 0  -1 0  2  -1 0  -1 0  4


    k=   0  1  2  3  4  5  6  7  8  9
    j=  10 11 12 13 14 15 16 17 18  19
    k=                              4

         a  b  a  b  c  a  b  a  b  c

next    -1 0  -1 0  2  -1 0  -1 0  4


    k=   5
    j=   20
    k=
         g
   next  5


如果 k=-1   那 next[20]=0

发现自己好无聊,把上面的玩意打了出来
2015-07-06 22:44
快速回复:KMP算法中一处不明白的地方
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.099212 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved