kmp算法实现

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值