KMP算法
来源:互联网 发布:广联达清标软件 编辑:程序博客网 时间:2024/05/16 03:57
一直以来KMP算法都不太理解,现在抽空进行了好好分析和研究一下,KMP的算法核心在于匹配串,根据匹配串的特征进行比对,KMP算法思路启发演示:
思路启发一:
思路启发二:
思路启发三(我们增加next数组来,什么叫next数组?next数组就是当不匹配的时候,模式字符串进行移动的索引的向导):
思路启发四:
实际代码流程演示:
void get_next(){//字符串索引0表示字符串的总个数next[1]=0;front=0,end=1;while(end < src[0]){if(0==front || src[front] == src[end]){front++;//前缀end++;//后缀next[end]=front;}else{//回溯front=next[front];}}}
代码图解:
KMP算法优化:
后来有人发现:KMP算法是有缺陷的,比如我们源字符串aaaabcde,子串aaaax
其中很容易得到next数组为01234。如图:
根据上面的结论我们可以将算法进行优化:
void get_next(){//字符串索引0表示字符串的总个数next[1]=0;front=0,end=1;while(end < src[0]){if(0==front || src[front] == src[end]){front++;end++;if(next[end]!=next[front]){next[end]=front;}else{next[end]=next[front];}}else{//回溯front=next[front];}}}
最后KMP查找字符串代码如下:
<pre name="code" class="cpp">int Find_KMP(String S,String T,int nPos){int i=pos;int j=1;int next[255];get_next(T,next);while(i< S[0] && j<T[0]){if(0==j || S[i]==T[j]){i++;j++;}else{j=next[i];//匹配失败从next数组获取新索引匹配}}if(j>T[0]){//表示匹配成功return i-T[0];}return -1;}
0 0
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- KMP算法
- kmp算法
- kmp算法
- KMP算法
- KMP算法
- powerdesigner取消字段中name和code自动关联
- windows 配置hosts
- 赶集网SQL自动上线
- http get和post区别介绍
- Palindrome Partitioning
- KMP算法
- Android Activity 初识(一)
- web--火狐插件firebug安装
- 最大连续子序列
- 黄聪:Python+NLTK自然语言处理学习(一):
- jdk7新特性学习笔记
- 系统架构师???
- iOS手势总结
- 小希的迷宫