求子串-KPM模式匹配-NFA/DFA
Posted 懒惰的咕噜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求子串-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的主要内容,如果未能解决你的问题,请参考以下文章