学习KMP的博客链接 博主讲解的很到位,排版赏心悦目,在此感谢。
C++
#include <iostream>
using namespace std;
void get_next(const char *T, int next[]){
int len = (int)strlen(T);
int i=0;
int j=-1;
next[0]=-1;
while(i<len-1){
if(j==-1 || T[i]==T[j]){
i++;
j++;
next[i]=j;
} else {
j = next[j];
}
}
cout<<"====== next ==========="<<endl;
for(int i=0; i<8; i++){
cout<<next[i]<<" ";
}
cout<<endl;
}
int KMP(const char *S, const char *T){
int slen = (int)strlen(S);
int tlen = (int)strlen(T);
int *next = new int[tlen];
if(tlen>slen) return -1;
get_next(T, next);
int i = 0;
int j = 0;
while(S[i]!='\0' && T[j]!='\0'){
if(S[i]==T[j]){
i++;
j++;
}
else{
//j = next[j];
if(next[j]==-1){
i++;
j = 0;
}
else j = next[j];
}
}
return i-tlen;
}
int main(){
char S[16]="abcabaaabaabcac";
char T[9]="abaabcac";
cout<<KMP(S,T)<<endl;
return 0;
}
Java
public class KMP {
public static void getNext(String p,int next[]){
int i=0;
int j=-1;
int n=p.length();
next[0]=-1;
while(i<n-1){
if(j==-1 || p.charAt(i)==p.charAt(j)){
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
public static int KMPmatch(String s,String p){
int i=0;
int j=0;
int []next;
next=new int[p.length()];
getNext(p, next);
while(i<s.length() && j<p.length()){
if(s.charAt(i)==p.charAt(j)){
i++;
j++;
}
else{
if(next[j]==-1){
i++;
j=0;
}
else j=next[j];
}
}
if(j>=p.length()){
return i-p.length();
}
else return -1;
}
public static void main(String[] args) {
String s="abcdefabcdefg";
String p="abcdefg";
int i=KMPmatch(s,p);
System.out.println("match at index "+i);
}
}