kmp算法

来源:互联网 发布:软件测试自动化书籍 编辑:程序博客网 时间:2024/06/03 06:06
package kmp;public class KmpDemo {/** * @param args */public static void main(String[] args) {String tar = "aaaaaacefghij";String mode = "aaac";char[] tars = tar.toCharArray();char[] patterns = mode.toCharArray();int[] nexts = computNext(patterns);//TODO testfor (int i : nexts) {System.out.print(i + " ");}System.out.println();int suc = kmpMatch(tars, patterns, nexts);System.out.println("is match suc? " + suc);}/** * 找出模式串的next[]数组   实际为模式串的前缀后缀的最大相同子序列的最大长度数组. * @param patterns * @return */private static int[] computNext(char[] patterns) {int[] nexts = new int[patterns.length];for (int i = 1; i < patterns.length; i++) {int k = nexts[i - 1];while (patterns[i] != patterns[k] && k != 0) {k = nexts[k - 1];}if (patterns[i] == patterns[k]) {nexts[i] = k + 1;} else {nexts[i] = 0;}}return nexts;}public static int kmpMatch(char[] tar, char[] pattern, int[] nexts) {int i = 0;int j = 0;while ( i < tar.length && j < pattern.length )        {            if( j == 0 || tar[i] == pattern[j] )            {                ++i;                ++j;            }            else            {                j = nexts[j - 1];                          //当匹配失败的时候直接用p[j_next]与s[i]比较,                //下面阐述怎么求这个值,即匹配失效后下一次匹配的位置            }        }        if( j >= pattern.length )            return i - pattern.length;        else            return -1;    }}

0 0