有关字符串的算法(KMP,Manacher,BM)陆续补充

KMP算法:

引言:

KMP算法是一种改进的字符串匹配算法

字符串匹配:即寻找str_target在str_source中出现的位置

没有改进的字符串匹配:用暴力法进行搜索,枚举出所有的情况然后一一比较。缺点:耗费了很多时间,时间复杂度非常高。所以需要改进。

这里举一个暴力匹配的例子:

在"zabcae"中寻找"abcab" :

KMP算法优势:

可以看到,每次出现不匹配时,i都会回溯到上一次的位置。而由于前几次比较的结果,可以避免i的回溯,并且找到一个比较好的j的位置进行比较,从而减小

许多重复的运算。

KMP中的NEXT数组:

前面说到 j 会进行回溯,而 j 应该回溯到什么地方呢?

由next[]数组来回答,具体看下图:

可以看到,NEXT[ ]数组保证了i不会回溯,并且j会回溯到较好的一个位置

NEXT[ ]数组的实现:

先给出代码:

 1 void cre_next(char * p/*模式串首地址*/,int len/*模式串长度*/) {
 2     int j = 0;
 3     int k = -1;
 4     next_[0] = -1;
 5
 6     while (j < len - 1) {
 7         if ( k==-1 || p[j]==p[k]) {
 8             next_[j + 1] = k + 1;
 9             j++;
10             k++;
11         }
12         else {
13             k = next_[k];
14         }
15
16     }
17 }

看起来一头雾水,接下来我们来一步步分析每句代码的含义。

最本质的就是  p[k]=p[j]和p[k]!=p[j]时两种情况的讨论,但经过多人的修改,变成了上面这种代码简洁的形式。

简略来说就是:

当p[k]=p[j]时,next[j+1]=k+1

当p[k]!=p[j]时,k=next[k]  然后回到第一步进行判断。

获取到next数组时实际上就完成了KMP算法的很大一部分,接下来就稍微修改下暴力破解时的代码就好了。

2019/2/15更新,未完待续。。。

原文地址:https://www.cnblogs.com/virgildevil/p/10374068.html

时间: 2024-10-30 00:33:21

有关字符串的算法(KMP,Manacher,BM)陆续补充的相关文章

字符串查找算法-KMP

/** *    KMP algorithm is a famous way to find a substring from a text. To understand its' capacity, we should acquaint onself with the normal algorithm. */ /** *    simple algorithm * *    workflow: *        (say,  @ct means for currently position o

字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(string)和子串(pattern),要求返回子串在原字符串中首次出现的位置.比如原字符串为"ABCDEFG",子串为"DEF",则算法返回3.常见的算法包括:BF(Brute Force,暴力检索).RK(Robin-Karp,哈希检索).KMP(教科书上最常见算法).BM(

字符串(1)---KMP &amp; 扩展KMP &amp; Manacher

练习:点击打开链接 字符串也是ACM中的重头戏,基本内容有KMP ,扩展KMP, Manacher ,AC自动机,后缀数组,后缀自动机.按照专题来做共分三部分. LCS LIS LCIS不知道算不算....点击打开链接 小技巧:匹配问题不区分大小写,则将其全部转为小写. 暴力匹配: 用strstr函数就能解决       I M N Z(枚举长度 三份) 一.KMP算法 解决单一模式串匹配问题. 利用失配后的nxt数组减少移位,达到O(n)级别.资料自行百度. 延展: 1.求最小循环节 点击打开

字符串查找与匹配之BM算法

一.字符串查找:1.在Word. IntelliJ IDEA.Codeblocks等编辑器中都有字符串查找功能.2.字符串查找算法是一种搜索算法,目的是在一个长的字符串中找出是否包含某个子字符串. 二.字符串匹配:1.一个字符串是一个定义在有限字母表上的字符序列.例如,ATCTAGAGA是字母表 E ={A,C,G,T}上的一个字符串.2.字符串匹配算法就是在一个大的字符串T中搜索某个字符串P的所有出现位置.其中,T称为文本,P称为模式,T和P都定义在同一个字母表E上.3.字符串匹配的应用包括信

codeforces #30E Tricky and Clever Password KMP+Manacher+二分

题目大意:给定一个字符串S,要求分成A+prefix+B+middle+C+suffix6段,满足: |prefix|=|suffix| |middle|为奇数 prefix+middle+suffix为回文串 除middle外所有段长度都可以为0 要求最大化|prefix|+|middle|+|suffix|,输出一组方案(|prefix|=|suffix|=0时只输出middle) 首先我们发现suffix串是顶着右端点的,因此我们可以枚举|suffix| 对于每个|suffix|我们需要求

poj 3461 字符串单串匹配--KMP或者字符串HASH

http://poj.org/problem?id=3461 先来一发KMP算法: #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <iostream> #include <cmath> #include <map> #include <queue> using namespace std;

菜鸟学算法-KMP算法

一. KMP算法 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,简称KMP算法.KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息. 二. KMP算法的意义 先举一个简单模式匹配的例子,给定字符串T=“abababca”,S=“bacbababaabcbab”,判断T是否是S的子串,如果用暴力扫描的话,就是拿着T字符串从

字符串匹配算法之KMP

KMP是单模匹配算法,主串是S,模式串是P,查找P在S中出现的位置. 主要是思想是主串的索引 i 递增,当主串与模式串发生不匹配时,把模式串右移,右移的位数为 j – fail[j] ,对于模式串计算fail函数,这个函数用来表示计算模式串某个位置发生失配时,模式串重新匹配的位置. fail应该指向最后一个可能产生匹配的地方,P[1..fail[j]-1]是P[1..j-1]的最长相等前缀后缀. 有个优化的地方:如果P[j]和P[fail[j]]是同一个字符,那么回溯后马上又匹配失败,可以直接令

Levenshtein字符串距离算法介绍

Levenshtein字符串距离算法介绍 文/开发部 Dimmacro KMP完全匹配算法和 Levenshtein相似度匹配算法是模糊查找匹配字符串中最经典的算法,配合近期技术栏目关于算法的探讨,上期介绍了KMP算法的一些皮毛,收到了同事的一些反馈,本期再接再厉,搜集了一些资料,简单谈谈Levenshtein相似度匹配算法,希望能抛砖引玉. 算法简介: Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,其原理是两个字符串之间,由