鉴于原理有点复杂,详细原理可以参考这篇文章http://blog.csdn.net/v_july_v/article/details/7041827

  本文直接从结论入手,应付考试和竞赛足够了。

  设T为目标串("aaabbbaabbabcabcabbaba"),pat为模式串("aabbabc")。

  这是模式串的next数组:

j(下标) 0 1 2 3 4 5 6
pat a a b b a b c
next[j] -1 0 1 0 0 1 0

  KMP算法:

  j=0时,next[j]=-1。表示下一趟匹配比较时,模式串的第-1个字符与目标串上次失配的位置对齐。(其实等同于第0个字符与目标串上次失配的下一个位置对齐),模式串需要移动到posT-next[j]的位置。(posT为T串下标)

  j=1时,next[j]=0。表示下一趟匹配比较时,模式串的第0个字符与目标串上次失配的位置对齐。模式串需要移动到posT-next[j]个位置。

  j=2时,next[j]=1。表示下一趟匹配比较时,模式串的第1个字符与目标串上次失配的位置对齐。模式串需要移动到posT-next[j]个位置。

  以此类推......

  

  那么下面只要求出next数组即可,next数组是如何形成的?

  从下标0开始,一直到lengthP-1为止(lengthP是模式串的长度),每次寻找该下标前面前缀与后缀相同的最大长度(前后缀不包括前面整个字符串,即起始位置和终止位置都相等的那一个字符串,下面有解释)。

  j=0时,字符a前面无字符,故标记-1;

  j=1时,字符a前面有字符a,但由于“前后缀不包括前面整个字符串”的规则,所以并没有相同的前后缀一说,故标记为0。

  j=2时,字符b前面有字符aa,前后缀相同的字符串为a,故标记为前后缀的长度1。

  以此类推......(PS:前后缀的计算都是从左到右的)

  其实这样说是为了方便理解next数组,而next数组的实际形成也是一次KMP算法,它也是一个匹配字符串的过程,用后缀去匹配前缀的过程。

  代码如下:

  

 #include<iostream>
#include<string>
using namespace std;
string T;
string pat;
void getNext(int next[],int lengthP){//lengthP为模式串P的长度
int j=,k=-;//j为P串的下标,k用来记录该下标对应的next数组的值
next[]=-;//初始化0下标下的next数组值为-1
while(j<lengthP){ //对模式串进行扫描
if(k==-||pat[j]==pat[k]){//串后缀与前缀没有相等的子串或者此时j下标下的字符与k下的字符相等。
j++;k++;
next[j]=k;//设置next数组j下标的值为k
}else
k=next[k];//缩小子串的范围继续比较
}
} int kmp(int k,int next[]){
int posP=,posT=k;//posP和posT分别是模式串pat和目标串T的下标,先初始化它们的起始位置
int lengthP=pat.length();//lengthP是模式串pat长
int lengthT=T.length();//lengthT是目标串T长
while(posP<lengthP&&posT<lengthT){//对两串扫描
if(posP==-||pat[posP]==T[posT]){//对应字符匹配
posP++;posT++;
}else
posP=next[posP];//失配时,用next数组值选择下一次匹配的位置
}
if(posP<lengthP) return -;
else return posT-lengthP;//匹配成功
} int main(){
T="aaabbbaabbabcabcabbaba";
pat="aabbabc";
int lengthP=pat.length();
int next[lengthP]={};
getNext(next,lengthP);
int pos=kmp(,next);
cout<<pos<<endl;
cout<<"next[]:";
for(int i=;i<lengthP;i++){
cout<<next[i]<<" ";
}
return ;
}

  

  

  

  

  

KMP字符串模式匹配算法(C++实现)的更多相关文章

  1. [转] 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

    字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boy ...

  2. 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

    字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 ...

  3. 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法

    ref : https://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP ...

  4. 字符串模式匹配算法--BF和KMP详解

    1,问题描述 字符串模式匹配:串的模式匹配 ,是求第一个字符串(模式串:str2)在第二个字符串(主串:str1)中的起始位置. 注意区分: 子串:要求连续   (如:abc 是abcdef的子串) ...

  5. Java数据结构之字符串模式匹配算法---Brute-Force算法

    模式匹配 在字符串匹配问题中,我们期待察看源串 " S串 " 中是否含有目标串 " 串T " (也叫模式串).其中 串S被称为主串,串T被称为子串. 1.如果在 ...

  6. Java数据结构之字符串模式匹配算法---KMP算法2

    直接接上篇上代码: //KMP算法 public class KMP { // 获取next数组的方法,根据给定的字符串求 public static int[] getNext(String sub ...

  7. Java数据结构之字符串模式匹配算法---KMP算法

    本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基 ...

  8. 字符串模式匹配算法1 - BF和KMP算法

    在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...

  9. 字符串模式匹配算法系列(二):KMP算法

    算法背景: KMP算法是由Donald Knuth和Vaughan Pratt于1970年共同提出的,而James H.Morris也几乎同时间独立提出了这个算法.因此人们将其称作“克努特-莫里斯-普 ...

随机推荐

  1. Linux/Ubuntu 16.04 使用校园网客户端Dr.com DrClient 有线连网,同时开启WiFi热点

    前面写过Ubuntu 16.04 使用校园网客户端 DrClient 无线上网,在这篇文章中将要介绍下,在Ubuntu 16.04上如何使用校园网客户端实现有线登录,这个问题也让博主困惑了很久,但是问 ...

  2. A customized combobox with JQuery

    要求实现一个轻量级的在客户端筛选的combobox,支持大数据量(超过1000个items),能快速检索内容,并支持数据的设置和活动等基本操作.在这之前尝试过使用Jquery UI的Autocompl ...

  3. VSC 解决红底线问题

    话不多说  设置里代码奉上 { "editor.minimap.enabled": false, "workbench.iconTheme": "vs ...

  4. 解决 golang unrecognized import path "golang.org/x" 之类错误的一种尝试

    如果使用的开发IDE是goland,那么 打开 FILE -> setting -> Go Modules 选项 ,在proxy 选项上填写 "https://goproxy.i ...

  5. ArrayBlockingQueue源码分析

    ArrayBlockingQueue是一个基于数组实现的有界的阻塞队列. 属性 //底层存储元素的数组.为final说明一旦初始化,容量不可变,所以是有界的. final Object[] items ...

  6. Linux centos yum仓库 自制

    内网下Yum仓库搭建配置 1.实验环境 虚拟机环境: VMware 12 版本虚拟机 网络环境: 内网 IP 段:172.16.1.0 外网 iP 段(模拟):10.0.0.0 实验基础:(能够上网, ...

  7. Mybatis 基本使用

    工程结构: 1.在test库创建表student(MySql数据库) 2.创建实体类Student.java package com.gdut.testMybatis.vo; public class ...

  8. 函数的创建与区别和 prototype

    https://www.cnblogs.com/haoxl/p/5267724.html(copy) https://www.cnblogs.com/loveyoume/p/6112044.html( ...

  9. Java中的String,StringBuilder,StringBuffer

    String被final修饰,不可变,每次更改其实是重新创建了一个对象.StringBuilder,StringBuffer是可变的. StringBuffer是线程安全的,StringBuilder ...

  10. Element类型和HTML元素获取

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...