扩展KMP算法描述:
给出模板串S和串T,长度分别为Slen和Tlen,要求在线性时间内,对于每个S[i](0<=i<Slen),求出S[i..Slen-1]与T的
最长公共前缀长度,记为extend[i]
代码:
import java.util.Scanner;
public class Main {
public int[] getNext(String s){
int[] next=new int[s.length()+1];
next[0]=s.length();
int a=0,p=0; //记录匹配成功的字符的最远位置p,及起始位置a
for(int i=1,j=-1;i<s.length();i++,j--){
if(j<0||i+next[i-a]>=p){
if(j<0){
p=i;j=0;
}
while(p<s.length()&&s.charAt(p)==s.charAt(j)){
p++;j++;
}
next[i]=j;
a=i;
}
else{
next[i]=next[i-a];
}
}
return next;
}
public int[] getExtend(String s,String t){
int[] extend=new int[s.length()];
int[] next=getNext(t);
int a=0,p=0;
for(int i=0,j=-1;i<s.length();i++,j--){
if(j<0||i+next[i-a]>=p){
if(j<0){
j=0;p=i;
}
while(p<s.length()&&j<t.length()&&s.charAt(p)==t.charAt(j)){
p++;j++;
}
extend[i]=j;
a=i;
}else{
extend[i]=next[i-a];
}
}
return extend;
}
}