KMP Java实现
package algorithm.string;
/**
* @program: AlgorithmJ
* @description: KMP匹配算法
* @author: SuperHakce
* @create: 2018-11-24 22:35
**/
public class KMPMatching {
//模式串
private char[] patternString;
//next数组
private Integer next[];
//初始化
public KMPMatching(String patternString){
this.patternString = patternString.toCharArray();
next = new Integer[patternString.length()];
createNext();
}
//打印next数组
public void showNext(){
for (Integer integer : next) {
System.out.print(integer + " ");
}
System.out.println();
}
//字符串匹配
public boolean isContainPattern(String str){
if(null == str){
return false;
}
char[] map = str.toCharArray();
for(int i = 0,j = 0;i < map.length;i ++){
while (j > 0 && patternString[j] != map[i]){
j = next[j - 1];
}
if(patternString[j] == map[i]){
j ++;
}
if(j == patternString.length){
return true;
}
}
return false;
}
//生成next数组
private void createNext(){
int p = 1, k = 0;
next[0] = 0;
for (;p < next.length; ++p){
while (k > 0 && patternString[p] != patternString[k]){
k = next[k - 1];
}
if(patternString[p] == patternString[k]){
k ++;
}
next[p] = k;
}
}
public static void main(String[] args) {
KMPMatching kmpMatching = new KMPMatching("ababaca");
kmpMatching.showNext();
if(kmpMatching.isContainPattern("bacbababadababacambabacaddababacasdsd")){
System.out.println("YES IT IS CONTAIN");
}else {
System.out.println("YES IT IS NOT CONTAIN");
}
}
}