串的模式匹配算法(KMP)

算法:

#include<IOSTREAM>
using namespace std;

#define MAXSIZE 100

void calNext(const char *T,int *next);//T为模式串,next为预判数组
int kmp_match(const char *S,const char *T);//在主串S中寻找模式串T,如果找到返回其位置,否则返回-1。位置从0开始

void calNext(const char *T,int *next)
{
    int n = strlen(T);
    if(n <= 0)
    {
        return;
    }
    int j = 0,k = -1;
    next[0] = -1;
    while(j < n)
    {
        if(k==-1 || T[j]==T[k])
        {
            j++;
            k++;
            next[j] = k;
        }else
        {
            k = next[k];
        }
    }
}
int kmp_match(const char *S,const char *T)
{
    if(S==NULL || T==NULL)
    {
        return -1;
    }
    int n = strlen(S);//主串长度
    int m = strlen(T);//模式串长度

    int next[MAXSIZE];
    calNext(T,next);

    int i = 0,j = 0;
    while(i+m <= n)
    {
        for(;i<n&&j<m&&S[i]==T[j];++i,++j);
        if(j==m)
            return i-m;
        j = next[j];
        if(j==-1)
        {
            j++;
            i++;
        }
    }
    return -1;
}

注:

原理:利用已经部分匹配这个有效信息,保持i指针不回溯,通过修改j指针,让模式串尽量地移动到有效的位置,有效位置即为所谓的next数组。

next数组计算过程:

声明next数组下标从0开始,定义next[0]=-1;模式串为T[]

假如求T中j+1位的next[j+1]

将其前一位的内容与其前一位的next值(next[j])的内容(T[next[j]])进行比较;

如果他们相等(T[j]==T[next[j]]),则next[j+1]=next[j]+1;

如果他们不相等,则继续向前比较,直到找到next值对应的内容与前一位相等为止,则在这个next值上加1;

如果直到第一位都没有与之相等,则next[j+1]=0

串的模式匹配算法(KMP),布布扣,bubuko.com

时间: 2024-10-07 06:38:40

串的模式匹配算法(KMP)的相关文章

《数据结构》之串的模式匹配算法——KMP算法

1 //串的模式匹配算法 2 //KMP算法,时间复杂度为O(n+m) 3 #include <iostream> 4 #include <string> 5 #include <cstring> 6 using namespace std; 7 8 //-----串的定长顺序存储结构----- 9 #define MAXLEN 255 //串的最大长度 10 typedef struct { 11 char ch[MAXLEN + 1]; //存储串的一维数组 12

串的模式匹配算法 ------ KMP算法

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int* get_next(char t[], int length) 6 { 7 int i = 0, j = -1; 8 int* next = (int *)malloc(length * sizeof(int)); 9 next[0] = -1; 10 while (i < length) 11 { 12 if (j =

第四章:2.串 -- 串的模式匹配算法(KMP)

前言: 目录: 1.串类型的定义 2.串的表示和实现 3.串的模式匹配算法 4.串操作应用举例 正文: 串的模式匹配即,在给定主串S 中,搜索子串T 的位置,如果存在T 则返回其所在位置,否则返回 0 串的模式匹配算法 主串 S: a b c a b c d s v t 子串 T: a b c d 一.原始算法 匹配一旦失败,子串即向右移动一个单位,直到完全匹配停止. 第一次匹配:(注:红色代表不匹配(失配)) S: a b c a b c a b c d s v t   T: a b c d

串、串的模式匹配算法(子串查找)BF算法、KMP算法

串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3--.an ' n = 0时为空串串的顺序存储结构:字符数组,串的长度就是数组末尾'\0'前面的字符个数数组需在定义时确定长度,有局限性数组的最大长度二:串的堆分配存储表示typedef struct { char *ch; //若是非空串,则按串长分配存储区 //否则ch为空 int length; //串长度}HS

串的模式匹配算法(BF算法和KMP算法)

串的模式匹配算法 子串的定位操作通常称为串的 模式匹配,其中T称为 模式串. 一般的求子串位置的定位函数(Brute Force) 我写java的代码是这样的 int index(String S,String T,int pos){ char[] s_arr = S.toCharArray(); char[] t_arr = T.toCharArray(); int i,j,k;//i是主串S的指针,j是模式串的指针 if(pos < 0 || pos>S.length() || S.len

24、蛤蟆的数据结构笔记之二十四串的模式匹配算法

24.蛤蟆的数据结构笔记之二十四串的模式匹配算法 本篇名言:"燧石受到的敲打越厉害,发出的光就越灿烂. -- 马克思" 来看下两个算法,BF和KMP算法在串的模式匹配中实现. 欢迎转载,转载请标明出处: 1.  BF算法 BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果.B

数据结构- 串的模式匹配算法:BF和 KMP算法

Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从串s 的第二个字符起再重新和串t进行比较. 2) 依此类推,直至串t 中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功. Brute-Force算法的实现 c语言实现: [cpp] vie

4.2 串的模式匹配算法

<?php header("content-type:text/html;charset=utf-8"); class Linear_string{ /** * 串模式匹配算法 * *包括 * 1.串的初始化 __contruct() * 2.朴素的模式匹配算法 index() * 3.KMP模式匹配算法 * 4.改进的KMP模式匹配算法 */ private $string; private $length; //构造函数 public function __construct

【数据结构】1、串的模式匹配算法

首先我们一般求子串的位置的时候,我们可以使用这样的方法 /* *功能:这个是定长的串的顺序存储 *时间:2015年7月15日17:16:01 *文件:SString.h *作者:cutter_point */ #ifndef SSTRING_H #define SSTRING_H #define MAXSTRLEN 255 class SString { unsigned char* ch; //我们的串的顺序存储空间 unsigned int length; //我们有效元素的个数 publi