第四十一课 KMP子串查找算法】的更多相关文章

问题: 右移的位数和目标串没有多大的关系,和子串有关系. 已匹配的字符数现在已经有了,部分匹配值还没有. 前六位匹配成功就去查找PMT中的第六位. 现在的任务就是求得部分匹配表. 问题:怎么得到部分匹配表呢? 前缀集合和后缀集合取最长的交集就是部分匹配值. 例如,上图中前缀和后缀没有交集,部分匹配值就是0. 问题: 怎么编程产生部分匹配表呢? 从第2个字符开始递推,做一个贪心的假设,我们现在要求的匹配值是由上一次得到的匹配值加1得到. 假设有5个字符,当前的匹配值是3,当有6个字符时,我们就假设…
1. 朴素算法的改进 (1)朴素算法的优化线索 ①因为 Pa != Pb 且Pb==Sb:所以Pa != Sb:因此在Sd处失配时,子串P右移1位比较没有意义,因为前面的比较己经知道了Pa != Sb,可以利用己经比较过的事实,而不必进行第2轮的比较,从而提高效率. ②KMP算法就是为解决这一问题而提出的! (2)部分匹配与前后缀(以S字符串“ABCDAB”为例) ①前缀:除了最后一个字符以外,一个字符的全部头部组合的集合.如,字符串S的前缀有{A,AB,ABC,ABCD,ABCDA},其中AB…
0.目录 1.KMP 子串查找算法 2.KMP 算法的应用 3.小结 1.KMP 子串查找算法 问题: 如何在目标字符串S中,查找是否存在子串P? 朴素解法: 朴素解法的一个优化线索: 示例: 伟大的发现: 匹配失败时的右移位数与子串本身相关,与目标串无关 移动位数 = 已匹配的字符数 - 对应的部分匹配值 任意子串都存在一个唯一的部分匹配表 部分匹配表示例: 问题: 部分匹配表是怎么得到的? 前缀 除了最后一个字符以外,一个字符串的全部头部组合 后缀 除了第一个字符以外,一个字符串的全部尾部组…
1, 如何在目标字符串 s 中,查找是否存在子串 p(本文代码已集成到字符串类——字符串类的创建(上)中,这里讲述KMP实现原理) ? 1,朴素算法: 2,朴素解法的问题: 1,问题:有时候右移一位是没有意义的: 2,KMP 算法可以右移一定的位数,提高效率: 3,朴素算法和 KMP 算法对比示例图: 2,伟大的发现(KMP): 1,匹配失败时的右移位数与子串本身相关,与目标无关: 2,移动位数 = 已匹配的字符数 - 对应的部分匹配值: 1,“已匹配的字符数”已知,“对应的部分匹配值”未知:…
#include <iostream> #include <windows.h> using namespace std; void get_next(char *str,int *num) { ; int len = strlen(str); ; ;//相等时一直往下循环 ;//标记是否在循环过程中不匹配,如果在循环过程中不匹配,则要防止跳过这个数 ;i<len;i++) { do { ] == str[idFront]) { flag2 = ; num[i] = ++am…
串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n = 0时为空串串的顺序存储结构:字符数组,串的长度就是数组末尾‘\0'前面的字符个数数组需在定义时确定长度,有局限性数组的最大长度二:串的堆分配存储表示typedef struct { char *ch; //若是非空串,则按串长分配存储区 //否则ch为空 int length; //串长度}HS…
KMP算法 Knuth–Morris–Pratt algorithm 克努斯-莫里斯-普拉特 算法 algorithm kmp_search: input: an array of characters, S (the text to be searched) an array of characters, W (the word sought) output: an array of integers, P (positions in S at which W is found) an int…
题意 给定两个字符串 \(A\) 和 \(B\),求 \(B\) 在 \(A\) 中的出现次数. 思路 这是一道 \(KMP\) 的模板题. 不过 \(Hash\) 是个好东西,可以用 \(Hash\) 代替 \(KMP\) 算法. 预处理两个字符串的哈希值,然后将 \(A\) 中所有长度为 \(len(B)\) 的子串的哈希值与 \(B\) 的哈希值比较即可. 时间复杂度 \(O(n + m)\),与 \(KMP\) 算法一样! 缺点就是常数略大,而且不能用 \(KMP\) 的 \(next\…
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十一课:体积雾气 体积雾气 把雾坐标绑定到顶点,你可以在雾中漫游,体验一下吧.   这一课我们将介绍体积雾,为了运行这个程序,你的显卡必须支持扩展"GL_EXT_fot_coord".    #include <…
1.简介 暴力字符串匹配(brute force string matching)是子串匹配算法中最基本的一种,它确实有自己的优点,比如它并不需要对文本(text)或模式串(pattern)进行预处理.然而它最大的问题就是运行速度太慢,所以在很多场合下暴力字符串匹配算法并不是那么有用.我们需要一些更快的方法来完成模式匹配的工作,然而在此之前,我们还是回过头来再看一遍暴力法匹配,以便更好地理解其他子串匹配算法. 如下图所示,在暴力字符串匹配里,我们将文本中的每一个字符和模式串的第一个字符进行比对.…