KMP算法java实现

来源:互联网 发布:售楼软件哪个好 编辑:程序博客网 时间:2024/06/05 02:45



从昨晚开始一直在研究KMP算法 其主要思想比较简单 但是要实现起来比较麻烦 并且网上关于KMP的实现的讲解众说纷纭 本文主要参考了我转载的上一篇文章 KMP字符串模式匹配详解 精华 中的第一种方法 将其对应的KMP算法进行了实现



/** * KMP算法 java 实现 * @author admin * */public class KMP {/** * 求与patten字符数组中每个字符对应的next值 存于next数组中 * @param patten要匹配的字符串 * @param nextnext数组 */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];}elsek = next[k];}}/** * 设在字符串S中查找模式串T,若S[m]!=T[n],那么,取T[n]的模式函数值next[n], *1. next[n]= -1 表示S[m]和T[0]间接比较过了,不相等,下一次比较 S[m+1] 和T[0] *2. next[n]=0 表示比较过程中产生了不相等,下一次比较 S[m] 和T[0]。 *3. next[n]= 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;elsereturn -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);}}