求子串

数据结构中对串的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的更多相关文章

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

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

  2. hiho#1445 重复旋律5 求子串数量 后缀自动机

    题目传送门 题意:给出一个字符串,求子串的个数. 思路:后缀自动机的题真是每做一题就更理解一些. SAM中的每一状态$p$都代表了一种子串,而p包含的字符串的个数是$len[p]-len[fa[p]] ...

  3. HDU 1686 Oulipo【kmp求子串出现的次数】

    The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...

  4. 编译系统中的 NFA/DFA算法理解

    1.问题概述 NFA 和 DFA浅析---要深入了解正则表达式,必须首先理解有穷自动机. 有穷自动机(Finite Automate)是用来模拟实物系统的数学模型,它包括如下五个部分: 有穷状态集St ...

  5. hiho#1457 重复旋律7 求子串和 后缀自动机

    题目传送门 题意: 给出若干个串,求所有子串的和,子串和的定义为十进制数,取模1e9+7. 思路: 对于一个串来说,一个状态p就代表着$right$相同的集合,假设我们已经知道了状态p的$sum$,以 ...

  6. Blue Jeans---poj3080(kmp+暴力求子串)

    题目链接:http://poj.org/problem?id=3080 题意就是求n个长度为60的串中求最长公共子序列(长度>=3):如果有多个输出字典序最小的: 我们可以暴力求出第一个串的所有 ...

  7. NFA/DFA算法

    1.问题概述 随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词 法分析独立出来做研究的重要性.不过词法分析器的作用却不限于此.回想一下我们的老师刚刚开始向我们讲述程序设计的时 ...

  8. 【spoj8222-Substrings】sam求子串出现次数

    http://acm.hust.edu.cn/vjudge/problem/28005 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length( ...

  9. KMP模版 && KMP求子串在主串出现的次数模版

    求取出现的次数 :  #include<bits/stdc++.h> ; char mo[maxn], str[maxn];///mo为模式串.str为主串 int next[maxn]; ...

随机推荐

  1. (function(){})()是什么意思?

    JS里面(function(){})()function外面的括号是什么意思? 定义了一个函数,并马上执行这个函数.这是js中常用的方式.好处呢.参考:js 闭包

  2. c++ 注册类到 lua

    test.h: #ifndef __TEST_H__ #define __TEST_H__ class CTest { public: CTest(); ~CTest(); int getA(); v ...

  3. fetch 关于七牛的content-type 的问题

    七牛要的Content-Type: multipart/form-data; boundary=<frontier>:那个boundary(formdata分隔符)是浏览器自己加的,不用管 ...

  4. js仿微信语音播放

    html结构如下: <div class="app-voice-you" voiceSrc="xx.mp3"> <img class=&quo ...

  5. java htmlunit 抓取网页数据

    WebClient webClient=new WebClient(BrowserVersion.CHROME); webClient.setJavaScriptTimeout(5000); webC ...

  6. angular_ui-router ——依赖注入

    Angularjs ui-router - 组件: $state / $stateProvider:管理状态定义.当前状态和状态转换.包含触发状态转换的事件和回调函数,异步解决目标状态的任何依赖项,更 ...

  7. 类ExampleA继承Exception,类ExampleB继承ExampleA。 有如下代码片断:

    try { throw new ExampleB("b") } catch(ExampleA e){ System.out.println("ExampleA" ...

  8. java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: x

    我的x值是2 我的SQL语句采用的是预编译的形式,我先单独把SQL语句提出来在数据库里运行正常,值也传输正常.仔细查了一下预编译的代码,发现当时粘贴复制 忘把序号修改了,改正后

  9. hibernate对象的三种状态

    对于hibernate,我想不在这里讲解了,我们就直接进入主题 在这里我将要说的是"hibernate对象的三种状态",对象是我们十分熟悉的,对吧!而对于对象它有三种状态 分别是瞬 ...

  10. android 触摸事件分析

    背景知识: 触摸屏可以有多个触控点 android中管理触控点通过一个数组来管理,涉及到index和id两个变量, index表示在数组中的下标,id表示这个触控点(pointer)的id,point ...