克努特 - 莫里斯 - 普拉特算法的C语言实现

发布时间:2020-02-12 发布网站:脚本之家
价值2580元廖雪峰前端视频终终终于免费啦!
脚本之家收集整理的这篇文章主要介绍了克努特 - 莫里斯 - 普拉特算法的C语言实现脚本之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。

脚本之家小编现在分享给大家,也给大家做个参考。

/*
   Copyright 2011 Shao-Chuan Wang <shaochuan.wang AT gmail.com>
 
    Permission is hereby granted,free of charge,to any person obtaining a copy
    of this software and associated documentation files (the "Software"),to deal
    in the Software without restriction,including without limitation the rights
    to use,copy,modify,merge,publish,distribute,sublicense,and/or sell
    copies of the Software,and to permit persons to whom the Software is
    furnished to do so,subject to the following conditions:
 
    The above copyright notice and this permission notice shall be included in
    all copies or substantial portions of the Software.
 
    THE SOFTWARE IS PROVIDED "AS IS",WITHOUT WARRANTY OF ANY KIND,EXPRESS OR
    IMPLIED,INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
    LIABILITY,WHETHER IN AN ACTION OF CONTRACT,TORT OR OTHERWISE,ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    THE SOFTWARE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int *compute_prefix_function(char *pattern,int psize)
{
    int k = -1;
    int i = 1;
    int *pi = malloc(sizeof(int)*psize);
    if (!pi)
        return NULL;
 
    pi[0] = k;
    for (i = 1; i < psize; i++) {
        while (k > -1 && pattern[k+1] != pattern[i])
            k = pi[k];
        if (pattern[i] == pattern[k+1])
            k++;
        pi[i] = k;
    }
    return pi;
}
 
int kmp(char *target,int tsize,char *pattern,int psize)
{
    int i;
    int *pi = compute_prefix_function(pattern,psize);
    int k = -1;
    if (!pi)
        return -1;
    for (i = 0; i < tsize; i++) {
        while (k > -1 && pattern[k+1] != target[i])
            k = pi[k];
        if (target[i] == pattern[k+1])
            k++;
        if (k == psize - 1) {
            free(pi);
            return i-k;
        }
    }
    free(pi);
    return -1;
}
 
int main(int argc,const char *argv[])
{
    char target[] = "ABC ABCDAB ABCDABCDABDE";
    char *ch = target;
    char pattern[] = "ABCDABD";
    int i;
 
    i = kmp(target,strlen(target),pattern,strlen(pattern));
    if (i >= 0)
        printf("matched @: %s\n",ch + i);
    return 0;
}
/** end of http://code.activestate.com/recipes/577908/ }}} */

以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

总结

以上是脚本之家为你收集整理的克努特 - 莫里斯 - 普拉特算法的C语言实现全部内容,希望文章能够帮你解决克努特 - 莫里斯 - 普拉特算法的C语言实现所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入脚本之家官方QQ群:1065694478