public class KMP {
//获取NEXT数组的函数
public static int[] GetArrNext(String str){
int[] Next= new int[str.length()];
String TempStr;
String TempStr1;
String TempStr2;
int Temp;
for(int i=0;i<str.length();i++){
TempStr=str.substring(0, i+1);
Temp = 0;
for(int j = 1;j<TempStr.length();j++) {
TS1=TempStr.substring(0,j);
TS2=TempStr.substring(TempStr.length()-j,TempStr.length());
if(TempStr1.equals(TempStr2)) {
Temp = j;
}
Next[i]=Temp;
}
}
return Next;
}
//匹配字符串函数
public static void search(String mainStr , String modStr) {
int main = 0;//主字符串匹配位置
int mod = 0;//模式串匹配位置
int[] Next = GetArrNext(modStr);
while(main < mainStr.length())
{
if(mainStr.substring(main).equals(modStr.substring(mod))) {
main++;//字符串相等,共同进一位
mod++;
}
else if (mod != 0) {
mod = Next[mod-1];//字符串不匹配了,模式串右移NEXT【mod-1】
}
else {
main++;// 字符串失配,主串右移一位
}
if(mod == modStr.length()) {
System.out.println(main-mod);//匹配成功,打印位置,继续右移寻找
mod = Next[mod-1];
}
}
}
public static void main(String []args){
String main ="ababaabaabac";
String mod ="abaabac";
search(main , mod);
}
}
NEXT数组的定义:
对于字符串P[0]-P[X],NEXT[X]的值K恰好为满足P[0]~P[K]=P[X-K]~P[X]的最大值
优化求NEXT数组的过程:
已知NEXT[X]求NEXT[X+1]
令NOW = X
若P[X+1]=P[NEXT[NOW]] //P为单个字符
则NEXT[X+1]=NEXT[NOW]+1;
若P[X+1]!=P[NEXT[NOW]]
令NOW = X-1
直到NEXT[NOW]=0
优化后
public static int[] GetArrNext2(String str){
int[] Next= new int[str.length()+1];
int i = 1,now = 0;
while(i<str.length()) {
if(str.substring(i)==str.substring(now)) {//字符相等则
now++;
Next[i]=now;
i++;
}
else if (now!=0)
now=Next[now-1];
else {
Next[i]=now;
i++;
}
}
return Next;
}