串的模式匹配算法
     问题:
         求子串位置的定位函数如何写? int index(SString S,SString T,int pos);
         给定串S,子串T,问T在S中从pos位开始第一次出现的位置是?

我没有使用字符数组或者string,而是自己实现SString,(这其实是数据结构作业)。S[0]中存放的是串的长度。





方法一:大暴力

 #include<iostream>
#include<cstdio>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN+]; //串的数组表示;注意: 0号存放串的实际长度,故这里是MAXSTRLEN+1
using namespace std;
/*方法一:最简单的直接暴力 复杂度O(len(S)*len(T))*/
int Index_simpal(SString S,SString T,int pos){
int i = pos;
int j = ;
while(i<=S[]&&j<=T[]){
if(S[i] == T[i]){
++i;
++j;
}else{
//一旦匹配不上,子串从头开始找,S串从上一次开始匹配的下一个位置开始找
j = ;
i = i - (j-) + ; //i是S串当前位置,j-1是当前匹配上的字符,i-(j-1)即上一次开始匹配的位置,+1即下一个位置
}
}
if(j>T[]){
//说明找到了
return i-T[]; //第一次匹配上的下标,注意这里面所有下标都是自然计数(0存长度)
}
return ;
}

方法二:KMP算法

维护一个next数组,next[i] 是下标1到i之间的串的最大公共前缀后缀长度+1;

在方法一的基础上,不把子串重新遍历,而是从next[j] 处遍历;

母串S不从上一次开始匹配的地方开始,而是从当前位置继续;

具体看代码以及注释: 

 /*
当不匹配时,不把i从上一次开始匹配的下一位开始寻找,而是从当前位开始寻找
而子串j下标,不从头开始,而是从最大公共前后缀长度的下一位开始寻找
这里引入最大公共前后缀的概念 当前匹配点之前的前、后缀相同的最大数值
next数组就是+1
自然计数
next[1] = 0;
*/
#include<iostream>
#include<cstdio>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN+]; //串的数组表示;注意: 0号存放串的实际长度,故这里是MAXSTRLEN+1
using namespace std;
int next[];
void get_next(SString T) {
next[] = ;
int i = ;
int j = ;
//遍历T
while(i<T[]) {
if(j == ||T[i] == T[j]){
++i;
++j;
next[i] = j;
}else{
j = next[j];
}
}
} int Index_KMP(SString S,SString T,int pos){
int i = pos;
int j = ;
while(i<=S[]&&j<=T[]){
if(j == ||S[i] == T[j]){
++i;
++j;
}else{
j = next[j]; //从第next[j]处开始找
}
}
if(j>T[]){
//说明找到了
return i-T[]; //第一次匹配上的下标,注意这里面所有下标都是自然计数(0存长度)
}
else return ;
} int main(){
SString s1 = "5abccd";
SString s2 = "2cd";
get_next(s1);
int ans = Index_KMP(s1,s2,);
printf("%d",ans);
}

【算法】串的模式匹配算法(KMP)的更多相关文章

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

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

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

    //KMP串的模式匹配算法 #include <stdio.h> #include <stdlib.h> #include <string.h> int* get_ ...

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

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

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

    串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...

  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. 串的模式匹配算法1 BF算法

    BF算法 字符串的模式匹配不一定要从主串的第一个位置开始,可以指定主串中查找的起始位置 pos. 2. 算法步骤: 1)分别利用计数器指针 i 和 j 指定主串和模式串即小字符串待比较的位置,初始化为 ...

  8. 串的模式匹配算法(求子串位置的定位函数Index(S,T,pos))

    串的模式匹配的一般方法如算法4.5(在bo4-1.cpp 中)所示:由主串S 的第pos 个字 符起,检验是否存在子串T.首先令i 等于 pos(i 为S 中当前待比较字符的位序),j 等于 1(j ...

  9. 字符串的模式匹配算法——KMP模式匹配算法

    朴素的模式匹配算法(C++) 朴素的模式匹配算法,暴力,容易理解 #include<iostream> using namespace std; int main() { string m ...

随机推荐

  1. Unity编辑器:自定义编辑器样式——GUIStyle

    通过GUIStyle,可以自定义Unity编辑器的样式. GUIStyle可以new一个全新的实例,这样,需要自己处理所有自己需要的效果. GUIStyle还可以基于已经存在的实例new一个新的实例, ...

  2. 《Python神经网络编程》中文版PDF+英文版PDF+源代码,业界良心书

    下载:https://pan.baidu.com/s/1hI6wMPq4UFvEmpgF3ZV1jg 关于内容 这本书主要揭示神经网络背后的概念,并介绍如何通过Python实现神经网络.全书主要讲了三 ...

  3. [翻译] 使用 .NET Core 3.0 创建一个 Windows 服务

    原文: .NET Core Workers as Windows Services 在 .NET Core 3.0 中,我们引入了一种名为 Worker Service 的新型应用程序模板.此模板旨在 ...

  4. HBase篇(5)- BloomFilter

    [每日五分钟搞定大数据]系列,HBase第五篇.上一篇我们落下了Bloom Filter,这次我们来聊聊这个东西. Bloom Filter 是什么? 先简单的介绍下Bloom Filter(布隆过滤 ...

  5. IT程序员的抉择:我要离开帝都了

    不知不觉在北京已经漂泊了近5年了,共为3家公司打过工,其中有几十人的小公司,也有几万人的大公司.随着工作技能的提升和工作经验的积累,薪水自然也涨了不少,但是看着北京的房价.物价飞涨,感觉自己赚多少都是 ...

  6. 移动H5页面微信支付踩坑之旅(微信支付、单页面路由模拟、按钮加锁、轮询等常见功能)

    开发背景: .net混合开发的vue模板语法的单页面应用,所以不存在脚手架以及没有路由可以跳转. 项目描述: 需要写两个页面,在订单详情页需要点击“请输入手机号”进入手机号绑定页面,手机号绑定成功后自 ...

  7. Jq相关常用操作

    1.select下拉列表操作 $(".kstitle").live('change', function () { var workType = $(this).val(); // ...

  8. tornado设置cookie并加密

    最近看看tornado,遇到了sso的东西,了解下如何设置cookie 1.基本cookie set_cookie 方法在用户的浏览中设置 cookie: get_cookie 方法在用户的浏览中获取 ...

  9. jQuery中.html(“xxx”)和.append("xxx")有什么区别

    append是追加,html是完全替换比如<p id="1"><p>123</p></p>$("#1").htm ...

  10. 如何利用mui实现底部选择器(含日期选择器)?

    1.第一步: 项目中应该引入相应的css和js文件,相关文件可到mui官网查询. <link rel="stylesheet" type="text/css&quo ...