求子串-KPM模式匹配-NFA/DFA
求子串
数据结构中对串的5种最小操作子集:串赋值,串比较,求串长,串连接,求子串,其他操作均可在该子集上实现
数据结构中串的模式匹配
KPM模式匹配算法
基本的模式匹配算法
//求字串subString 在串string中的位置
function subString(string, subString){
var i=0,j=0;
//当i或j超出范围退出
while(i<string.length&&j<subString.length){
if(string[i]==subString[j]){
++i;++j
}
else{
//当匹配不成功时,i由开始位置后移一位
i=i-j+1;j=0;
}
}
//如果是j超出范围则返回i-j,如果是i超出范围则表示未找到
if(j>=subString.length) return i-j;
else return false;
}
看的出来,每当匹配不成功时,i总是回朔本次匹配的开始位置
KPM,一种改进了的模式匹配算法,解决i回朔问题

这里引出了一个很重要的问题‘包含前缀’,
以subString='abcabcacab',为例。前缀串'abca'='abc[abca]cab'方括号中的字串的,如果在该字串之后c处匹配失败,只需要让前缀串的a与括号中的a对其,接着从匹配失败的c处继续匹配。
所以我们需要求出subString在j处匹配失败后,需要向回移动j-k+1的值
假设f(j)代表subString在j之前的包含前缀中最大的k,例如'abcabca'中,k-1=1,4,即最大k为5;f(8)=5
那么'abcabcacab'中,f(9)=f(8)+(subString[5]?==subString[8]),如果相等,则f(9)=6;如果不相等f(9)需要重新计算,因为subString[9-1]的c导致最大包含前缀不再是abca,而是一个已c结尾的包含前缀字串。实际上没有这样的字串;
blog.csdn.net/yukuninfoaxiom/article/details/6057736
blog.csdn.net/joylnwang/article/details/6778316/
http://www.rudy-yuan.net/archives/182/
www.webhek.com/misc/comparison-sort
编译原理词法分析器
NFA/DFA
求子串-KPM模式匹配-NFA/DFA的更多相关文章
- 串的模式匹配算法(求子串位置的定位函数Index(S,T,pos))
串的模式匹配的一般方法如算法4.5(在bo4-1.cpp 中)所示:由主串S 的第pos 个字 符起,检验是否存在子串T.首先令i 等于 pos(i 为S 中当前待比较字符的位序),j 等于 1(j ...
- hiho#1445 重复旋律5 求子串数量 后缀自动机
题目传送门 题意:给出一个字符串,求子串的个数. 思路:后缀自动机的题真是每做一题就更理解一些. SAM中的每一状态$p$都代表了一种子串,而p包含的字符串的个数是$len[p]-len[fa[p]] ...
- HDU 1686 Oulipo【kmp求子串出现的次数】
The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...
- 编译系统中的 NFA/DFA算法理解
1.问题概述 NFA 和 DFA浅析---要深入了解正则表达式,必须首先理解有穷自动机. 有穷自动机(Finite Automate)是用来模拟实物系统的数学模型,它包括如下五个部分: 有穷状态集St ...
- hiho#1457 重复旋律7 求子串和 后缀自动机
题目传送门 题意: 给出若干个串,求所有子串的和,子串和的定义为十进制数,取模1e9+7. 思路: 对于一个串来说,一个状态p就代表着$right$相同的集合,假设我们已经知道了状态p的$sum$,以 ...
- Blue Jeans---poj3080(kmp+暴力求子串)
题目链接:http://poj.org/problem?id=3080 题意就是求n个长度为60的串中求最长公共子序列(长度>=3):如果有多个输出字典序最小的: 我们可以暴力求出第一个串的所有 ...
- NFA/DFA算法
1.问题概述 随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词 法分析独立出来做研究的重要性.不过词法分析器的作用却不限于此.回想一下我们的老师刚刚开始向我们讲述程序设计的时 ...
- 【spoj8222-Substrings】sam求子串出现次数
http://acm.hust.edu.cn/vjudge/problem/28005 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length( ...
- KMP模版 && KMP求子串在主串出现的次数模版
求取出现的次数 : #include<bits/stdc++.h> ; char mo[maxn], str[maxn];///mo为模式串.str为主串 int next[maxn]; ...
随机推荐
- fetch 关于七牛的content-type 的问题
七牛要的Content-Type: multipart/form-data; boundary=<frontier>:那个boundary(formdata分隔符)是浏览器自己加的,不用管 ...
- CacheHelper
public static ObjectCache Cache { get { return MemoryCache.Default; } } public static bool TryGetCac ...
- PHP动态图像的创建要如何实现呢?
with-gd=[/path/to/gd] --with-jpeg-dir=[/path/to/jpeg-6b] --with-t1lib=[/path/to/t1lib] 完成添加后执行make命 ...
- 通达信5分钟.lc5和.lc1文件格式
一.通达信日线*.day文件 文件名即股票代码 每32个字节为一天数据 每4个字节为一个字段,每个字段内低字节在前 00 ~ 03 字节:年月日, 整型 04 ~ 07 ...
- ASP.NET MVC5----基本用法
由于之前在项目中也使用MVC进行开发,但是具体是那个版本就不是很清楚了,但是我觉得大体的思想是相同的,只是版本高的在版本低的基础上增加了一些更加方便操作的东西.下面是我学习ASP.NET MVC5高级 ...
- 挑战程序2.1.5 穷竭搜索>>宽度优先搜索
先对比一下DFS和BFS 深度优先搜索DFS 宽度优先搜索BFS 明显可以看出搜索顺序不同. DFS是搜索单条路径到 ...
- No module named 'urllib2'
import urllib2 response = urllib2.urlopen('http://www.baidu.com/') html = response.read() print html ...
- java的print,printf,println以及输入
java中有三种方式向控制台输入信息,分别是print,printf,println,现在简单介绍一下他们之间的异同. printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 pr ...
- mac os 禁止apache httpd自动启动(转)
mac os 禁止apache httpd自动启动 博客分类: 计算机使用 mac os不像linux有/etc/init.d/rc.local以及service的方式可以设置程序随机启动,而是使 ...
- 对一个二维数组进行升序排列a[0][1]为最小
public static int[][] dyadicArraySort(int a[][]){ int temp=0;int sum =0;int nn=0; for(int i=0;i<a ...