数据结构例程——串的模式匹配(KMP算法)

本文针对数据结构基础系列网络课程(4):串中第5课时串的模式匹配(KMP算法)

问题:串的模式匹配

KMP算法:

#include <stdio.h>
#include "sqString.h"
void GetNext(SqString t,int next[])  /*由模式串t求出next值*/
{
    int j,k;
    j=0;
    k=-1;
    next[0]=-1;
    while (j<t.length-1)
    {
        if (k==-1 || t.data[j]==t.data[k])  /*k为-1或比较的字符相等时*/
        {
            j++;
            k++;
            next[j]=k;
        }
        else
            k=next[k];
    }
}
int KMPIndex(SqString s,SqString t)  /*KMP算法*/
{
    int next[MaxSize],i=0,j=0;
    GetNext(t,next);
    while (i<s.length && j<t.length)
    {
        if (j==-1 || s.data[i]==t.data[j])
        {
            i++;
            j++;            /*i,j各增1*/
        }
        else j=next[j];         /*i不变,j后退*/
    }
    if (j>=t.length)
        return(i-t.length);         /*返回匹配模式串的首字符下标*/
    else
        return(-1);             /*返回不匹配标志*/
}
int main()
{
    SqString s,t;
    StrAssign(s,"ababcabcacbab");
    StrAssign(t,"abcac");
    printf("s:");
    DispStr(s);
    printf("t:");
    DispStr(t);
    printf("位置:%d\n",KMPIndex(s,t));
    return 0;
}

修正后的KMP算法

#include <stdio.h>
#include "sqString.h"
void GetNextval(SqString t,int nextval[])  //由模式串t求出nextval值
{
    int j=0,k=-1;
    nextval[0]=-1;
    while (j<t.length)
    {
        if (k==-1 || t.data[j]==t.data[k])
        {
            j++;
            k++;
            if (t.data[j]!=t.data[k])
                nextval[j]=k;
            else
                nextval[j]=nextval[k];
        }
        else  k=nextval[k];
    }

}
int KMPIndex1(SqString s,SqString t)    //修正的KMP算法
{
    int nextval[MaxSize],i=0,j=0;
    GetNextval(t,nextval);
    while (i<s.length && j<t.length)
    {
        if (j==-1 || s.data[i]==t.data[j])
        {
            i++;
            j++;
        }
        else
            j=nextval[j];
    }
    if (j>=t.length)
        return(i-t.length);
    else
        return(-1);
}
int main()
{
    SqString s,t;
    StrAssign(s,"ababcabcacbab");
    StrAssign(t,"abcac");
    printf("s:");
    DispStr(s);
    printf("t:");
    DispStr(t);
    printf("位置:%d\n",KMPIndex1(s,t));
    return 0;
}
时间: 2024-09-27 12:30:14

数据结构例程——串的模式匹配(KMP算法)的相关文章

数据结构例程——串的模式匹配(Brute-Force算法)

本文针对数据结构基础系列网络课程(4):串中第5课时串的模式匹配(Brute-Force算法). 问题:模式匹配,设有主串s和子串t,在主串s中找到一个与子串t相等的子串. 解答:(头文件sqstring.h见顺序串算法库) #include <stdio.h> #include "sqString.h" int index(SqString s,SqString t) { int i=0,j=0; while (i<s.length && j<

数据结构例程——串的顺序存储应用

本文针对数据结构基础系列网络课程(4):串中第3课时串的顺序存储应用. 例1:串比较 问题: 设计实现串比较运算的算法 算法思路 (1)比较s和t两个串共同长度范围内的对应字符: ① 若s的字符>t的字符,返回1: ② 若s的字符<t的字符,返回-1: ③ 若s的字符=t的字符,按上述规则继续比较. (2)当(1)中对应字符均相同时,比较s和t的长度: ① 两者相等时,返回0: ② s的长度>t的长度,返回1: ③ s的长度<t的长度,返回-1. #include <stdi

数据结构例程——二叉树的层次遍历算法

本文是数据结构基础系列(6):树和二叉树中第12课时层次遍历算法的例程. [二叉树的层次遍历算法] 实现二叉树的层次遍历算法,并对用"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"创建的二叉树进行测试. 请利用二叉树算法库. [参考解答](btreee.h见算法库) #include <stdio.h> #include "btree.h" void LevelOrder(BTNode *b) { BTNode *p; BT

数据结构例程——最小生成树的克鲁斯卡尔算法

本文是[数据结构基础系列(7):图]中第12课时[最小生成树的克鲁斯卡尔算法]的例程. (程序中graph.h是图存储结构的"算法库"中的头文件,详情请单击链接-) #include <stdio.h> #include <malloc.h> #include "graph.h" #define MaxSize 100 typedef struct { int u; //边的起始顶点 int v; //边的终止顶点 int w; //边的权值

经典算法题每日演练——第七题 KMP算法

原文:经典算法题每日演练--第七题 KMP算法       在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树是变态级的,那么kmp算法比红黑树还要变态,很抱歉,每次打kmp的时候,输 入法总是提示"看毛片"三个字,嘿嘿,就叫"看毛片算法"吧. 一:BF算法      如果让你写字符串的模式匹配,你可能会很快的写出朴素的bf算法,至少问题是解决了,我想大家很清楚的知

大话数据结构十一:字符串的模式匹配(KMP算法)

1. KMP算法简介: kmp算法是一种改进的字符串匹配算法,相比朴素算法,KMP算法预先计算出了一个哈希表,用来指导在匹配过程中匹配失败后尝试下次匹配的起始位置,以此避免重复的读入和匹配过程.这个哈希表被称为"部分匹配值表"(Particial match table),这种设计是KMP算法最精妙之处. 2. KMP算法分析: 下面以阮一峰老师博客中的一篇文章来分析KMP算法的原理:有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否

JavaScript中数据结构与算法(五):经典KMP算法

  这篇文章主要介绍了JavaScript中数据结构与算法(五):经典KMP算法,本文详解了KMP算法的方方面在,需要的朋友可以参考下 KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右. 通过上一章显而易见BF算法也是属于前缀的算法,不过就非常霸蛮的逐个匹配的效率自然不用提了O(mn),网上

字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下.   KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的"部分匹配"的结果将模式子串向右"滑动"尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目

JavaScript中数据结构与算法(五):经典KMP算法_javascript技巧

KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右. 通过上一章显而易见BF算法也是属于前缀的算法,不过就非常霸蛮的逐个匹配的效率自然不用提了O(mn),网上蛋疼的KMP是讲解很多,基本都是走的高大上路线看的你也是一头雾水,我试图用自己的理解用最接地气的方式描述 KMP KMP也是一种优化版的