KMP算法
来源:互联网 发布:iphone mac连接 编辑:程序博客网 时间:2024/06/03 00:20
参考博文:http://www.cnblogs.com/Yan-C/p/3792015.html
博文写得很清晰,推荐去看看
next[]数组求解
遇到过2种next[]数组,也是懵逼,不过思想大致还是差不多,就是算最大的相同前缀串和后缀串。
这2中next[]数组一种以-1开始,一种以0开始。以下还是以教科书上的-1为准吧。
//NEXT数组,未优化void getnext(char *s){ int next[81]={-1,0}; int i=0,j=-1,l=strlen(s); while(i<l) if(j==-1||s[i]==s[j]) next[++i]=++j; else j=next[j];}
//NEXT数组,优化版void getnext(char *s){ int next[81]={-1,0}; int i=0,j=-1,l=strlen(s); while(i<l) if(j==-1||s[i]==s[j]){ i++; j++; if(s[i]==s[j]) next[i]=next[j]; else next[i]=j; //next[i]=s[i]==s[j]?next[j]:j; } else j=next[j];}
未优化和优化版求出来的NEXT数组是不一样的,但仔细理解优化版,却发现很在理。
对于字符串“abcabcdf”
看一下字符串前面部分abca,未优化版会回到到第一个a的地方然后再去与第一个a比较一下,何必呢?本来就是因为该位置不等于a才引起的回退,所以优化版直接回退到第一个a对应的next数组值。
表述起来还是比较难的,还是看代码最直接明了。
利用next数字进行匹配
bool KMP(char *pStr, char *pSubStr, int *next){ //此处主要是为了讲KMP,不对非法参数做处理 int i=0; int j=0; int len1 = strlen(pStr); int len2 = strlen(pSubStr); while(i<len1 && j<len2) if(j==-1 || pStr[i]==pSubStr[j]) ++i,++j; else j = next[j]; if(j==len2) return true; return false;}
看代码吧,清晰明了,没啥好解释。
0 0
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- KMP算法
- kmp算法
- kmp算法
- KMP算法
- KMP算法
- Python合并两个有序列表
- 三天根治腰酸背痛的传统养生法
- 多线程相关问题的整理
- 基于地图的短信追踪小练习(6)对话框之item的删除
- Zookeeper全解析——Client端(转)
- KMP算法
- RecycleView实现复杂的布局
- zookeeper系列之通信模型(转)
- Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案二
- 用斐波那契数列来说明递归和迭代的区别
- HBase使用场景和成功案例 (转)
- 建立流程绩效指标链的原则
- 最长公共子序列(可打印所有子序列)
- LeetCode405 Convert a Number to Hexadecimal