数据结构之串,next和nextval计算及KMP算法(java实现)
public class SString {
String [] ch;
int lenght;
int MaxLen;
SString(int maxLen){
this.MaxLen=maxLen;
this.ch=new String[maxLen];
this.lenght=this.ch.length;
}
@Override
public String toString() {
return "SString{" +
"ch=" + Arrays.toString(ch) +
", lenght=" + lenght +
'}';
}
//
public static void main(String[] args) {
System.out.println("----------------------next,nextval----------------------------------");
String [] arr3 = {"a","b","a","c","b","b","a"};
SString T1=CreatSstring(arr3);
int [] j= new int[T1.lenght];
for (int i=0;i<T1.lenght;i++){
j[i]=i+1;
}
System.out.println("j :"+Arrays.toString(j));
System.out.println("模式串 :"+Arrays.toString(T1.ch));
int [] next1 = new int[T1.lenght];
get_next(T1,next1);
int [] nextval = new int[T1.lenght];
get_nextval(T1,nextval);
System.out.println("----------------------KMP算法----------------------------------");
String [] arr = {"a","b","a","c","b","b","a"};
SString T=CreatSstring(arr);
String [] arr1 = {"c","b","b"};
SString S=CreatSstring(arr1);
int [] next = new int[S.lenght];
System.out.println("----------------KMP,next-----------------");
System.out.println("S在T中第一次出现位置(下标:"+Index_KMP(T,S, get_next(S,next)));
int [] nextval1 = new int[S.lenght];
System.out.println("---------------KMP,nextval----------------");
System.out.println("S在T中第一次出现位置(下标:"+Index_KMP(T,S, get_nextval(S,nextval1)));
}
//创建串
public static SString CreatSstring(String [] arr){
SString S= new SString(arr.length);
for (int i=0;i<arr.length;i++){
S.ch[i]=arr[i];
}
return S;
}
//计算nextval值
public static int [] get_nextval(SString T,int [] nextval){
int i=0,j=-1;
nextval[0]=-1;
while (i<T.lenght-1){
if(j==-1 || T.ch[i]==T.ch[j]){
++i;++j;
if (T.ch[i]!=T.ch[j]) {
nextval[i]=j;
}
else{
nextval[i]=nextval[j];
}
}else {
j=nextval[j];
}
}
for (int k=0;k<nextval.length;k++){
++nextval[k];
}
System.out.println("nextval[j]:"+Arrays.toString(nextval));
return nextval;
}
//计算next值
public static int [] get_next(SString T,int [] next){
int i=0,j=-1;
next[0]=-1;
while (i<T.lenght-1){
if(j==-1 || T.ch[i]==T.ch[j]){
++i;++j;
next[i]=j;
}else {
j=next[j];
}
}
for (int k=0;k<next.length;k++){
++next[k];
}
System.out.println("next[j] :"+Arrays.toString(next));
return next;
}
//kMP算法
public static int Index_KMP(SString S,SString T,int [] next){
int i=0,j=0;
while (i<S.lenght && j<T.lenght){
if(j==-1 || S.ch[i]==T.ch[j]){
++i;++j;
}else {
j=next[j]-1;
}
}
if(j>=T.lenght){
return i-T.lenght;
}
else {
return 0;
}
}
}