开发者社区 问答 正文

模式p='abcaababc '的KMP算法和KMP,并改进算法的匹配过程!

模式p='abcaababc '的KMP算法和KMP,并改进算法的匹配过程!

展开
收起
知与谁同 2018-07-18 12:28:43 2014 分享 版权
1 条回答
写回答
取消 提交回答
  • 求子串next[j]值的算法:
    void GetNext(String T, int next[])
    { int j = 1, k = 0;
    next[1] = 0;
    while(j < len(T)){

    if( k == 0 || T[j]==T[k])
    {j++; k++; next[j]=k; }
    else k = next[k];
    }
    }
    KMP 算法的自然语言描述
    设s为主串,t为模式串,设i为主串s当前比较字符的下标,j为模式串t当前比较字符的下标,令i和j的初值为pos和1。当si = tj时,i和j分别增1再继续比较;否则 i不变,j改变为next[j]值(即模式串右滑)后再继续比较。依次类推,直到出现下列两种情况之一:
    一是 j退回到某个j=next[j]值时有si = tj ,则 i和j分别增1后再继续比较;
    二是j退回到j=0时,令主串和子串的下标各增1,随后比较si和t1 。这样的循环过程一直进行到变量大于等于s的长度或变量j大于等于t的长度为止。
    int KMPIndex(String S, int start,String T, int next[ ])
    {
    int i = start, j=1;

    while ( i <= S[0] && j< T[0]) {
    //不失配则继续比较后续字符
    if (j == 0 || S [i] = = T[j] ) {i++; j++ }
    //特点:S的i指针不回溯,而且从T的k位置开始匹配
    else j=next[j];
    }

    if (j >= T[0]) return ( i-T(0) );
    else return -1;
    }
    2019-07-17 22:55:58
    赞同 展开评论
问答分类:
问答地址: