上一篇,我们已经找出了KMP算法对应的数组,这一篇我们将开始用next算法和KMP思想来完成程序:
先贴上代码:
package KMPAL;
public class KMPAL {
public int [] FindNext(String s)
{
int m=s.length();
int [] next=new int[m];
int k=-1;
next[0]=-1;
/*while(j<m-1)
{
while(k>=0&&s.charAt(k)!=s.charAt(j))
k=next[k];
j++;
k++;
next[j]=k;
}*/
next[1]=0;
int j=2;
while(j<m)
{
int index=0;
int end=j-1;
while(s.charAt(index)==s.charAt(end) && end>0 &&index<j)
{
index++;
end--;
}
next[j]=index;
j++;
}
for(int i=0;i<next.length;i++) System.out.print(next[i]+" ");
System.out.println();
return next;
}
public void KMPsf(String T,String S)
{
int j=0;
int k=0;
int start=0;
int m=T.length();
int[] next=new int [S.length()];
next=FindNext(S);
boolean find=false;
int result=0;
while(j<m)
{
if(T.charAt(j)==S.charAt(k)&&k>=-1)
{
j++;
k++;
}
else
{
if(k!=-1)k=next[k];
if(k==-1)
{
k++;
j++;
}
}
if(k==S.length())
{
find=true;
result=j-S.length();
break;
}
}
if(find) System.out.println(result);
else System.out.println("没有匹配的字符串");
}
public static void main(String[] args)
{
String t="CGTAGCGTCTCTCATATGTCATGC";
String s="CGTCTCTC";
KMPAL kmp=new KMPAL();
int [] next=kmp.FindNext(s);
kmp.KMPsf(t, s);
}
这一串数的next数组是:-1 0 0 0 1 0 1 0
当我们比较到第四个位置的时候:next值为0,这个时候,我们回到模式字符串(S)的0的位置
为什么要回到模式字符串0的位置呢(⊙o⊙)?
我们来看这张图(其实这张图也并不能讲得很清楚)
假设你现在的目标字符串比较到b这里突然发现不匹配,那么你现在就要开始移动模式字符串了,你发现
我们还是假设模式字符串的前四位是acca 那么现在b这里就是3了,