字符串模式匹配,即子串的定位操作。就是判断主串S中是否存在给定的子串,如果存在,那么返回子串在S中的位置,否则返回0。
实现这种操作有两种算法:

朴素的模式匹配算法

设主串S长度为n,子串T长度为m。

思路
 对于主串的每个字符,做长度为$strlen(T)$的循环,判断是否与子串匹配。
 最好的情况就是一开始就匹配成功,时间复杂度O(1);
 最坏的情况就是每次匹配失败都是在T的最后一个元素,复杂度O(n*m);
 平均情况复杂度O(n + m)。
 int match(string s, string t) {
if (t.size() > s.size())
return -; int i = , j = ;
while (i < s.size() && j < t.size()) {
if (t[j] == s[i]) {
++i;
++j;
}
else {
i = i - j + ;
j = ;
}
} if (j == t.size())
return i - j;
else
return -;
}

KMP算法

思路
KMP主要分两步:
 1. 进行T的自匹配
这一步关键在于得到Next数组,从T的第一位开始对自身匹配,在某一位置能匹配的最长长度即是当前位置Next值。
Next中的值是字符串的前缀集合与后缀集合的交集中最长元素的长度,将Next[0] = -1。
举例来说:T=ababaca,前缀为pre,后缀为post。
i = 1: 要处理"a", pre = "", post = "", Next[1] = 0;
i = 2: 要处理"ab", pre = a, post = b, Next[2] = 0;
i = 3: 要处理"aba", pre = {a, ab}, post = {ba, a}, Next[3] = 1;
i = 4: 要处理"abab", pre = {a, ab, aba}, post = {bab, ab, b}, Next[4] = 2;
i = 5: 要处理"ababa", pre = {a, ab, aba, abab}, post = {baba, aba, ba, a}, Next[5] = 3;
......
Next数组{-1,0,0,1,2,3,0,1}
 2. S与T的匹配
这步的匹配和朴素匹配没有太大差异,只是主串S的指针不用回溯,而将子串的指针j回溯到Next[j]位置。
 void nextCompute(string t, vector<int>& next) {
int i = , j = -;
while (i < t.size()) {
if (j == - || t[i] == t[j]) {
++i;
++j;
next[i] = j;
}
else {
j = next[j];
}
}
} int KMP(string s, string t) {
vector<int> next(t.size() + , -);
nextCompute(t, next); int i = , j = ;
while (i < (int)s.size() && j < (int)t.size()) {
if (j == - || s[i] == t[j]) {
++i;
++j;
}
else {
j = next[j];
}
} if (j == t.size())
return i - j;
else
return -;
}

改进KMP算法

主要改进了Next数组。

 /*计算next数组*/
void next_compute(char T[], int* next)
{
int i = , j = -;
next[] = -;
while (i < strlen(T))
{
if (- == j || T[i] == T[j]) //自匹配
{
i++;
j++;
if (T[i] != T[j])
next[i] = j;
else
next[i] = next[j];
}
else //字符不同,j值回溯
{
j = next[j];
}
}
}

Pattern Matching的更多相关文章

  1. Beginning Scala study note(5) Pattern Matching

    The basic functional cornerstones of Scala: immutable data types, passing of functions as parameters ...

  2. Symbols of String Pattern Matching

    Symbols of String Pattern Matching in Introduction to Algorithms. As it's important to be clear when ...

  3. scala pattern matching

    scala语言的一大重要特性之一就是模式匹配.在我看来,这个怎么看都很像java语言中的switch语句,但是,这个仅仅只是像(因为有case关键字),他们毕竟是不同的东西,switch在java中, ...

  4. Zhu-Takaoka Two-dimensional Pattern Matching

    Two dimensional pattern matching. Details may be added later.... Corresponding more work can be foun ...

  5. [PureScript] Break up Expressions into Cases in PureScript using Simple Pattern Matching

    Pattern matching in functional programming languages is a way to break up expressions into individua ...

  6. [Scala] Pattern Matching(模式匹配)

    Scala中的match, 比起以往使用的switch-case有著更強大的功能, 1. 傳統方法 def toYesOrNo(choice: Int): String = choice match ...

  7. pattern matching is C# 7.0

    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is 原来的版本 private static s ...

  8. C#9.0 终于来了,带你一起解读Pattern matching 和 nint 两大新特性玩法

    一:背景 1. 讲故事 上一篇跟大家聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都达到了新高,甚是欣慰,不管大家对新特性是多 ...

  9. 函数式编程之-模式匹配(Pattern matching)

    模式匹配在F#是非常普遍的,用来对某个值进行分支匹配或流程控制. 模式匹配的基本用法 模式匹配通过match...with表达式来完成,一个完整的模式表达式长下面的样子: match [somethi ...

  10. KMP string pattern matching

    The function used here is from the leetcode. Details can be found in leetcode problem: Implement str ...

随机推荐

  1. MyBatis(七):使用注解替代xml文件

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...

  2. MyBatis(二):基础CRUD

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出1便就懂!b站搜索狂神说即可 https://space.bilibili.com/95256449?spm_id_from=333.788 ...

  3. keras与卷积神经网络(CNN)实现识别minist手写数字

    在本篇博文当中,笔者采用了卷积神经网络来对手写数字进行识别,采用的神经网络的结构是:输入图片——卷积层——池化层——卷积层——池化层——卷积层——池化层——Flatten层——全连接层(64个神经元) ...

  4. spring05

    通过静态工厂的方法创建bean:和实例工厂方法: <?xml version="1.0" encoding="UTF-8"?> <beans ...

  5. 请设计 一个密码生成器,要求随机生成4组10位密码(C语言)

    请设计 一个密码生成器,要求随机生成4组10位密码(密码只能由字母和数字组成),每一组必须包含至少一个大写字母,每组密码不能相同,输出生成的密码. #include<stdio.h> #i ...

  6. Linux 下如何隐藏自己不被发现?

    可能在某些情况下,自己运行的程序不想或者不方便被其他人看到,就需要隐藏运行的进程.或者某些攻击者采用了本文介绍的隐藏技术,也可以让大家看到如何进行对抗. 隐藏有两种方法: kernel 层面,不对用户 ...

  7. Java中的垃圾回收算法详解

    一.前言   前段时间大致看了一下<深入理解Java虚拟机>这本书,对相关的基础知识有了一定的了解,准备写一写JVM的系列博客,这是第二篇.这篇博客就来谈一谈JVM中使用到的垃圾回收算法. ...

  8. python-从酷狗下载爬取自己想要的音乐-可以直接拿来体验哟

    因为最近发现咪咕音乐版权好多,当时我就在想是不是可以爬取下来,然后花了一些时间,发现有加密,虽然找到了接口,但是只能手动下载VIP歌曲,对于我们学IT的人来说,这是不能忍的,于是就懒得去解密抓取了,但 ...

  9. flutter和react native如何选择

    [关于性能]跨平台开发第一个考虑的就是性能问题RN的效率由于是将View编译成了原生View,所以效率上要比基于Cordova的HTML5高很多,但是它也有效率问题,RN的渲染机制是基于前端框架的考虑 ...

  10. vs 基础

    1     写入 读取: 1)  写入:Console.Write("hello china")                                      光标紧跟 ...