KMP算法及其实现

#include <stdio.h>
#include <stdlib.h>
#define MAX 10000

typedef struct string{
    char ch[MAX];
    int len;
}string;

int size(string *s);
int KMP(string *l1,string *l2,int next[]);
void getNext(string *l,int next[]);

int main(int argc, const char * argv[]) {
    string *l1 = (string *)malloc(sizeof(string));
    string *l2 = (string *)malloc(sizeof(string));
    printf("输入待匹配的字符串:");
    scanf("%s",l1->ch);size(l1);
    printf("输入模式字符串:");
    scanf("%s",l2->ch);size(l2);
    int next[MAX];
    getNext(l2, next);
    if (KMP(l1, l2, next)) {
        printf("匹配成功\n");
    }else
        printf("匹配失败\n");
    return 0;
}

int size(string *s){
    int i=0;
    while (s->ch[i] != '\0') {
        i++;
    }
    s->len = i;
    return s->len;
}

int KMP(string *l1,string *l2,int next[]){
    int i=0,j=0;
    while (i<l1->len && j<l2->len) {
        if (j == -1 || l1->ch[i] == l2->ch[j]) {
            i++;
            j++;
        }else{
            j = next[j];
        }
    }
    if (j==l2->len) {
        return 1;
    }else
        return 0;
}

void getNext(string *l,int next[]){
    int i=0,k=-1;   //k表示前缀,i表示后缀
    next[0]=-1;
    while (i<l->len-1) {
        if (k == -1 || l->ch[k] == l->ch[i]) {
            ++k;
            ++i;
            if (l->ch[k] != l->ch[i]) {
                next[i] = k;
            }else{
                next[i] = next[k];
            }
        }else{
            k = next[k];
        }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,638评论 25 709
  • KMP的由来 在KMP算法之前,对文本进行匹配时使用的是朴素模式匹配算法,也就是最简单匹配算法.当然运行效率也是让...
    圣光忏悔阅读 1,800评论 2 13
  • 成都的湖是静的,宛如明镜一般,清晰地映射出天空的蓝;成都的湖是活的,层层鳞浪随风而起,伴着即将到来的细雨,在...
    504宝贝儿们阅读 191评论 0 0
  • 【上一章】二十九、月有阴晴圆缺 江月坐上了从苍水开往蓝谷的火车,和来时一样,孤身一人。 嘈杂的火车上,江月显得格外...
    林芷颐阅读 286评论 0 0
  • 今天所有的事情都涌上来了,请听我细数从头: 财务要求配合ERP技术人员把基础数据统一分类、统一名称,需要召集供应人...
    简单说吧阅读 116评论 0 0