kmp算法实现

来源:互联网 发布:淘宝3c快熟认证 编辑:程序博客网 时间:2024/06/08 06:00

java实现:

package al;


import java.util.ArrayList;


public class KMP {

//获取nexk数组
public static int[] getNext(String source){
int len=source.length();
int[] next =new int[len];
next[0]=-1;
int k=-1;
int i=0;
while(i<len-1){
while(k>=0&&source.charAt(i)!=source.charAt(k)){
k=next[k];
}
i++;
k++;
if(source.charAt(i)!=source.charAt(k)){
next[i]=k;
}
else{
next[i]=next[k];
}
}

return next;
}


//for循环获取next数组
public static int[] getNext_2(String source){
int len = source.length();
int[] next = new int[len];
next[0]=-1;
int k=-1;
for(int i=1;i<len;i++){
while(k>=0&&source.charAt(i-1)!=source.charAt(k)){
k=next[k];
}

k++;
if(source.charAt(i)!=source.charAt(k)){
next[i]=k;
}
else{
next[i]=next[k];
}
}

return next;
}

//实现字符串匹配
public static ArrayList<ArrayList<Integer>> getAdress(String source,String target){
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
int[] next = getNext(source);
int index=0,start=0,end=0;

while(start<target.length()-source.length()+1){
while(index<source.length()&&source.charAt(index)==target.charAt(end)){
end++;
index++;
}
if(index==source.length()){
ArrayList<Integer> temp = new ArrayList<>();
temp.add(start);
temp.add(end-1);
list.add(temp);
index=0;
start=end;
}
else{
index=next[index];
start=end-index;
if(index<0){
end=start;
index=0;
}
}
}

return list;
}


public static void main(String[] args){
String source = "abcdaabcab";
String target ="abcdadsdshdabcdaabcabrdfewecdsdesabcdaabcab";
// int[] next =getNext_2(source);
// for(int i=0;i<next.length;i++){
// System.out.print(next[i]+" ");
// }
System.out.println(getAdress(source, target).toString());
}



}

0 0