Java怎么实现KMP算法
本篇内容主要讲解“Java怎么实现KMP算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么实现KMP算法”吧!
KMP 算法KMP (Knuth-Morris-Pratt), 是一种改进的字符串匹配算法. KMP 算法解决了暴力匹配需要高频回退的问题, KMP 算法在匹配上若干字符后, 字符串位置不需要回退, 从而大大提高效率. 如图:
举个例子 (字符串 “abcabcdef” 匹配字符串 “abcdef”):
a
bcabcdef a
bcdefa
bcabcdef a
bcdefa 和 a 匹配2ab
cabcdef ab
cdefab
cabcdef ab
cdefab 和 ab 匹配3abc
abcdef abc
defabc
abcdef abc
defabc 和 abc 匹配4abca
bcdef abcd
efabca
bcdef abcd
efabca 和 abcd 不匹配, 回退. 暴力匹配回退到索引 1, 即 “b”, KMP 算法索引跳置 3, 即 “a”5ab
cabcdef a
bcdefabca
bcdef a
bcdef暴力匹配 b 和 a 不匹配, 后移. KMP 算法 a 和 a 匹配6abc
abcdef a
bcdefabcab
cdef ab
cdef暴力匹配 c 和 a 不匹配, 后移. KMP 算法 ab 和 ab 匹配7abca
bcdef a
bcdefabcabc
def abc
def暴力匹配 a 和 a 匹配. KMP 算法 abc 和 abc 匹配8abcab
cdef ab
cdefabcabcd
ef abcd
ef暴力匹配 ab 和 ab 匹配. KMP 算法 abcd 和 abcd 匹配9abcabc
def abc
defabcabcde
f abcde
f暴力匹配 abc 和 abc 匹配. KMP 算法 abcde 和 abcde 匹配10abcabcd
ef abcd
efabcabcdef abcdef
暴力匹配 abcd 和 abcd 匹配. KMP 算法 abcdef 和 abcdef 匹配 , 匹配完成11abcabcde
f abcde
fabcabcdef abcdef
暴力匹配 abcde 和 abcde 匹配. KMP 算法匹配完成12abcabcdef abcdef
abcabcdef abcdef
暴力匹配 abcd 和 abcd 匹配, 匹配完成. KMP 算法匹配完成部分匹配表部分匹配表 (Partial Match Table) 指的是 “前缀” 和 “后缀” 的最长共有元素的长度.
举个例子, 字符串 “ABCDABD” 的前缀与后缀:
重点:
KMP 算法中移动的位数 = 已匹配的字符数 - 对应的部分匹配值
importjava.util.Arrays;publicclassKMPMatch{publicstaticintMatch(Stringstr1,Stringstr2,int[]next){//初始化索引inti=0;intj=0;for(;i<str1.length();i++){if(j>0&&str1.charAt(i)!=str2.charAt(j)){//不匹配,回退i=i-next[j-1];j=0;}//匹配if(str1.charAt(i)==str2.charAt(j)){j++;}//返回索引if(j==str2.length()){returni-j+1;}}return-1;}//部分匹配publicstaticint[]getNext(Strings){//定义数组intnext[]=newint[s.length()];//初始化i,jinti=0;intj=-1;next[0]=-1;//遍历while(i<s.length()-1){if(j==-1||s.charAt(i)==s.charAt(j)){//匹配成功next[i]=j+1;i++;j++;}else{//一旦不匹配成功j回退到-1j=-1;}}returnnext;}publicstaticvoidmain(String[]args){//字符串1Stringstr1="BBCABCDABABCDABD";//字符串2Stringstr2="ABCDABD";//匹配表int[]next=getNext(str2);System.out.println(Arrays.toString(next));//KMP算法intresult=Match(str1,str2,next);System.out.println(result);}}
输出结果:
[0, 0, 0, 0, 1, 2, 0]
10
到此,相信大家对“Java怎么实现KMP算法”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。