KMP 算法

来源:互联网 发布:天津市基础教育网络 编辑:程序博客网 时间:2024/06/02 04:28

普通字符串匹配代码:

public class ModelMatch {public static void main(String[] args) {// 定义主串String primary = "ababcabcacbab";char[] pri = primary.toCharArray();// 定义子串String son = "abcac";char[] mod = son.toCharArray();int flag = index(pri, mod);System.out.println(flag);}/** * @匹配函数 找出子串在主串第一次出现的位置并返回,如果没有,则返回0 * @param pri *            主串 * @param son *            子串 * @return * @return int */public static int index(char[] pri, char[] son) {int i = 0; // 主串下标起始位置int j = 0; // 子串下标起始位置while (i < pri.length && j < son.length) {// 如果字符匹配,则继续比较下一个字符if (pri[i] == son[j]) {i++;j++;} else { // 否则主串下标进 1, 子串的下标恢复为起始位置 0。重新开始匹配i = i - j + 1;j = 0;}}// 如果相等j的下标==子串长度,表示找到if (j == son.length)return i - son.length;//返回匹配的下标位置elsereturn 0;}}

KMP实现字符串匹配代码:

public class KMP {//static int[] next = new int[0];public static void main(String[] args) {String primary = "ababcabcacbab";String modle = "abcac";char[] pri = primary.toCharArray();char[] mod = modle.toCharArray();int flag = index_KMP(pri,mod);if(flag!=0){System.out.println("开始匹配的位置是: "+flag);}else{System.out.println("主串不包含子串。。。");}}public static int index_KMP(char[] primary, char[] modle) {int i = 0;// 记录主串的下标int j = 0;// 记录模式串的下标// 获取next的函数值int[] next = getNext(modle);while (i < primary.length && j < modle.length) {try{if (j == -1 || primary[i] == modle[j]) {i++;j++;} else {j = next[j];}}catch(ArrayIndexOutOfBoundsException e){System.out.println("数组越界");}}if(j>=modle.length){return i-modle.length;}else{return 0;}}/** * 求模式串model的next函数值并存入数组next中 *  * @param model * @return void */public static int[] getNext(char[] model) {int[] next = new int[model.length];int i = 0; // 模式串的其实下标,并赋初值next[0] = -1;//next函数的定义int j = -1;// next数组的元素值while(i<model.length-1){if(j==-1 || model[i]==model[j]){i++;j++;next[i] = j;}else{j = next[j];}}return next;}}


原创粉丝点击