KMP算法java实现
2013-04-07 14:53
351 查看
从昨晚开始一直在研究KMP算法 其主要思想比较简单 但是要实现起来比较麻烦 并且网上关于KMP的实现的讲解众说纷纭 本文主要参考了我转载的上一篇文章 KMP字符串模式匹配详解 精华 中的第一种方法 将其对应的KMP算法进行了实现
/** * KMP算法 java 实现 * @author admin * */ public class KMP { /** * 求与patten字符数组中每个字符对应的next值 存于next数组中 * @param patten 要匹配的字符串 * @param next next数组 */ static void get_nextval(char[] patten, int[] next) { int j = 0; //patten数组下标 int k = -1; next[0] = -1; while(j<patten.length-1) { if((k==-1) || (patten[j]==patten[k])) { k++; j++; if(patten[j] != patten[k]) next[j] = k; else next[j] = next[k]; } else k = next[k]; } } /** * 设在字符串S中查找模式串T,若S[m]!=T ,那么,取T 的模式函数值next , *1. next = -1 表示S[m]和T[0]间接比较过了,不相等,下一次比较 S[m+1] 和T[0] *2. next =0 表示比较过程中产生了不相等,下一次比较 S[m] 和T[0]。 *3. next = k >0 但k<n, 表示,S[m]的前k个字符与T中的开始k个字符已经间接比较相等了,下一次比较S[m]和T[k]相等吗? *4. 其他值,不可能。 * @param test 被匹配的字符串 * @param patten 模式串 * @return */ static int kmp(char[] test, char[] patten) { if(test.length==0 || patten.length==0) return -1; int len = patten.length; int[] next = new int[len+1]; get_nextval(patten, next); int index = 0; int i = 0; int j = 0; while(i<test.length && j<patten.length) { if(test[i] == patten[j]) { i++; j++; } else { index += j-next[j]; if(next[j] != -1) j = next[j]; else { j = 0; i++; } } } if(j>=patten.length) return index; else return -1; } public static void main(String[] args) { String testStr = "bababcadbdafdsaf"; String patStr = "adb"; char[] test = testStr.toCharArray(); char[] patten = patStr.toCharArray(); int pos = kmp(test, patten); System.out.println(pos); } }
相关文章推荐
- KMP算法的java实现
- KMP算法及Java实现
- JAVA实现KMP算法理论和示例代码
- 【算法总结】KMP算法及java实现
- KMP算法的实现(Java语言描述)
- 凭借对KMP算法的了解,用java实现了一下,结果和java自带的字符串indexOf比,性能差了十倍。。。
- 字符串匹配之KMP算法思路、原理与Java实现
- KMP算法的java实现
- KMP算法的Java实现
- KMP算法java实现
- KMP算法的实现(Java语言描述)
- KMP算法Java实现以及总结
- KMP算法JAVA实现
- KMP算法的实现(Java语言描述)
- KMP算法的java实现
- java实现字符串kmp算法
- 数据结构Java实现——③串--->串的模式匹配:Brute-Force算法和 KMP算法
- KMP算法的实现(Java语言描述)
- 经典KMP算法C++与Java实现代码
- KMP算法java实现之策略模式