一、简单模式匹配算法(略,逐字符比较即可)

二、KMP模式匹配算法

next数组:j为字符序号,从1开始。

(1)当j=1时,next=0;

(2)当存在前缀=后缀情况,next=相同字符数+1;

(3)当前缀 != 后缀且j != 1时,next=1。

如下:

abcdex

next=011111

abcabx

next=011123

ababaaaba

next=011234223

说明:0位置为情况1;

1、2位置为情况3;

3-5位置一直有前缀对称,所以一直累加;

        6位置前缀不对称,j=next[ j ]找对称子串开始位置;如果没有继续j= next[ j ]直到 j = 0,next为0;

                 此处 i = 6, j = 4;第一次找: j = next[4] = 3, T[3] != T[6] ,没找到;第二次找: j= next[ 3 ] =1, T[2] == T[6], 找到累加 j+1 =2;

7位置同上;

8位置在7位置基础累加得到。

aaaaaaaab

next=012345678

说明:0位置为情况1;

1位置为情况3;

2-8位置一直有前缀对称,所以一直累加。

代码如下:

  1: void get_next(char T[], int * next)
  2: {
  3: int i = 1;
  4: int j = 0;
  5:
  6:     next[1] = 0;//条件(1)
  7:
  8: while(i < getlength(T))
  9:     {
 10: if(j == 0 || T[i] == T[j])
 11:         {
 12:             ++j;
 13:             ++i;
 14:             next[i] = j;//如果前缀一直有对称,则对称性累加
 15:         }
 16: else
 17:         {
 18:             j = next[j];//如果前缀不对称,则从对称性开始的地方开始累加;
 19: //如果仍然不对称,则继续从子子对称开始的地方开始累加;
 20:         }
 21:     }
 22: }
 23: 

三、KMP模式匹配算法改进

nextval数组:j为字符序号,从1开始。

(1)当j=1时,nextval=0;

(2)当存在前缀=后缀情况,nextval=相同字符数+1如果该字符在后缀中,则nextval = 前缀中该字符的nextval值。

(3)当前缀 != 后缀且j != 1时,nextval=1。

如下:

ababaaaba

next=     011234223

nextval=010104210

aaaaaaaab

next=     012345678

nextval=000000008

ababaaaba

next=     011234223

nextval=010104210

代码如下:

  1: void get_nextval(char T[], int * nextval)
  2: {
  3: int i = 1;
  4: int j = 0;
  5:
  6: nextval[1] = 0;//条件(1)
  7:
  8: while(i < getlength(T))
  9: {
 10:   if(j == 0 || T[i] == T[j])
 11:   {
 12:             ++j;
 13:             ++i;
 14:             if(T[i] != T[j])
 15:               nextval[i] = j;//条件(3),累加
 16:             else
 17:               nextval[i] = nextval[j];//条件(2)</strong>
 18:   }
 19:   else
 20:   {
 21:             j = nextval[j];//如果前缀不对称,则从对称性开始的地方开始累加;
 22:                            //如果仍然不对称,则继续从子子对称开始的地方开始累加;
 23:   }
 24: }
 25:
 26: }
 27: 

线性表-串:KMP模式匹配算法的更多相关文章

  1. 数据结构(三)串---KMP模式匹配算法

    (一)定义 由于BF模式匹配算法的低效(有太多不必要的回溯和匹配),于是某三个前辈发表了一个模式匹配算法,可以大大避免重复遍历的情况,称之为克努特-莫里斯-普拉特算法,简称KMP算法 (二)KMP算法 ...

  2. 数据结构(三)串---KMP模式匹配算法实现及优化

    KMP算法实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include ...

  3. 数据结构(三)串---KMP模式匹配算法之获取next数组

    (一)获取模式串T的next数组值 1.回顾 我们所知道的KMP算法next数组的作用 next[j]表示当前模式串T的j下标对目标串S的i值失配时,我们应该使用模式串的下标为next[j]接着去和目 ...

  4. [从今天开始修炼数据结构]串、KMP模式匹配算法

    [从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...

  5. 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...

  6. 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    --喜欢记得关注我哟[shoshana]-- 目录 1.朴素的模式匹配算法2.KMP模式匹配算法 2.1 KMP模式匹配算法的主体思路 2.2 next[]的定义与求解 2.3 KMP完整代码 2.4 ...

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

    //串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...

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

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

  9. 【算法】串的模式匹配算法(KMP)

    串的模式匹配算法     问题:         求子串位置的定位函数如何写? int index(SString S,SString T,int pos);         给定串S,子串T,问T在 ...

随机推荐

  1. Matlab中rand('state',sum(clock))解析

    一.问题来源 来自于一份PSO代码,PSO中需要初始化粒子位置和速度. 二.问题探究 众所周知,Matlab中的rand()函数产生的是伪随机数,但一般用来也可以接受.但是,如果我们知道伪随机数的初始 ...

  2. Searching in a rotated and sorted array

    Given a sorted array that has been rotated serveral times. Write code to find an element in this arr ...

  3. CSRF之攻击与防御

    0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/PO ...

  4. 我的vim配置

    之前都在虚拟机下面捣鼓Linux,有种隔靴搔痒的感觉.为了更快地熟悉Linux系统,重新安装了Ubuntu,首先就是配置vim. 下面是我的vim配置,为了方便,我在代码后添加注释说明. 1.配置C/ ...

  5. 扩展DJANGO的LISTVIEW

    不用MODEL,不用QUERYSET,而用get_queryset方法来扩展LISTVIEW, 从而实现特定过滤或搜索功能. class DVListView(ListView): template_ ...

  6. /storage/sdcard, /sdcard, /mnt/sdcard 三者的区别

    原文地址: /storage/sdcard, /sdcard, /mnt/sdcard 三者的区别 - petercao - 博客园 http://www.cnblogs.com/bluestorm/ ...

  7. yii2的安装

    yii2也是依赖于composer, 就像laravel, 所以先安装composer, 如果安装不上composer可以看laravel安装的文章. 安装好composer之后安装一个插件 comp ...

  8. MapReduce编程系列 — 4:排序

    1.项目名称: 2.程序代码: package com.sort; import java.io.IOException; import org.apache.hadoop.conf.Configur ...

  9. 理解TCP/IP协议

    TCP/IP协议是Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议. 单从TCP/IP协议这个名称看,好多人误 ...

  10. java网络基本类使用(一)

    1.怎么获取ip相关信息 import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumera ...