自用留档
public class kmp {
public static void main(String[] args){
// 01234567
String text = "i am a batman!";
String sub = "batman";
KmpAlgorithm kmp = new KmpAlgorithm(text, sub);
int index = kmp.KMP();
System.out.println(index);
}
/***
* 有两个串 string 和 subString
* 若sub存在于string里 则返回其下标
* 否则返回-1
*
*/
static class KmpAlgorithm{
public String text,subString;
public KmpAlgorithm(String text, String subString){
this.text = text;
this.subString = subString;
}
int[] getNext(){
int[] next = new int[subString.length()];
int j = 0;
for(int i = 1 ; i < subString.length() ; ++i){
while(subString.charAt(i) != subString.charAt(j) && j > 0)
j = next[j-1];
if(subString.charAt(i) == subString.charAt(j)) j++;
next[i] = j;
}
return next;
}
int KMP(){
if(subString.length() == 0) return 0;
int j = 0;
int[] next = getNext();
for(int i = 0; i < text.length(); ++i){
while(text.charAt(i) != subString.charAt(j) && j > 0)
j = next[j-1];
if(text.charAt(i) == subString.charAt(j))
j++;
if(j == subString.length())
return i - subString.length() + 1;
}
return -1;
}
}
}