KMP算法(简单的说)
来源:互联网 发布:手机淘宝详情页不显示 编辑:程序博客网 时间:2024/05/18 20:47
KMP算法的核心就是求解next数组,具体参考http://www.cnblogs.com/10jschen/archive/2012/08/21/2648451.html
package algorithm;//字符串匹配类public class StringMatcher {//朴素字符串匹配,t:要匹配的目标字符串,pattern:匹配的模式字符串public static int navieMatch(String t,String pattern){int len1 = t.length();int len2 = pattern.length();for (int i = 0; i <= len1-len2; i++) {int j = 0;//每次都设置patter从头开始匹配int k = i;//保存当前t的偏移量//第一个字符匹配成功,才开始之后的匹配while(t.charAt(k++) == pattern.charAt(j++)){//匹配成功if (j == len2) {return i;}}}return -1;}//根据模式pattern得到next数组public static int[] getNext(String pattern){int len = pattern.length();int[] next = new int[len];//第一个next为0next[0] = 0;for(int i = 1 ; i < len; i++){//k表示之前的对称性int k = next[i-1];/* *不断递归判断是否子对称 * k等于0时,说明不再存在子对称 * pattern[k]不等于pattern[i],说明子对称的后面的一个字符和当前字符不相等,所以继续递推 * 这些都不满足直接进行单个字符比较的条件 * */while (k != 0 && pattern.charAt(k) != pattern.charAt(i)) {k = next[k-1];//向前找子对称的子对称}if( pattern.charAt(i) == pattern.charAt(k))//找到了这个子对称,或者是直接继承了前面的对称性,这两种都在前面的基础上++ next[i]=k+1; else next[i]=0; //如果遍历了所有子对称都无效,说明这个新字符不具有对称性,清0}return next;}public static int kmpMatch(String t,String pattern){int[] next = getNext(pattern);int len1 = t.length();int len2 = pattern.length();for (int i = 0; i <= len1-len2; ) {int j = 0;//每次都设置patter从头开始匹配int k = i;//保存当前t的偏移量//第一个字符匹配成功,才开始之后的匹配while(t.charAt(k++) == pattern.charAt(j++)){//匹配成功if (j == len2) {return i;}}i += i - next[i] + 1;}return -1;}public static void main(String[] args) {System.out.println(navieMatch("abcabaabcabac","abaa"));int[] next = getNext("ababaca");for(int i : next){System.out.print(i+" ");}System.out.println();System.out.println(kmpMatch("abcabaabcabac","abaa"));}}
1 0
- KMP算法(简单的说)
- 简单的KMP算法
- 简单的KMP算法
- KMP算法(简单的运用)
- 简单的理解KMP算法
- 字符串匹配的KMP算法(说得最清楚的一篇)
- 一个全新的视角来看KMP算法(简单!形象!)
- 字符串匹配的KMP算法(简单清晰的认识KMP)
- 阿里天池的新任务(简单)KMP,看样子网上有bug的kmp算法还是有蛮多
- KMP算法真的很简单1
- KMP 算法真的很简单
- KMP 算法真的很简单
- KMP 算法真的很简单
- 最简单易读的KMP算法代码
- KMP算法的简单理解 【笔记】
- 字符串匹配的KMP算法(简单易懂)
- 用简单的方式讲解KMP算法
- Shingling算法-简单说
- Java项目经验——程序员成长的关键
- 编译器学习笔记之一:概述(未完)
- 精图规范1.0----11 绘制:填充、描边和标记符号 Painting: Filling, Stroking and Marker Symbols
- Windows编程 - 启动可执行(exe)程序 代码(C++)
- know your scrnsize!
- KMP算法(简单的说)
- 精图规范1.0----12 颜色 Color
- NSNotificationCenter消息通信机制介绍(KVO)
- 高效程序员的特征:聪明,懒惰
- 想让你陪我到天荒地老
- 如何变得有思想?
- Win32使用Psapi库枚举系统进程信息
- 磁盘分区错误,导致分区不能挂载
- ef linq select where dynamic singleordefault