KMP算法(java实现)

package suanfaTest;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

public class KMP01 {

public static int i=0,j=0;

public static int[] kmpNext(String ps){//Next数组

List nxt = new ArrayList();

int[] a = new int[ps.length()];//Next数组的长度为模板串的长度

int len = ps.length();

if (len == 0){

return null;

}else if (len == 1){

nxt.add(0);

for (int i=0; i<nxt.size(); i++)

{

a[i] = nxt.get(i);

}

return a;

}else if (len == 2){

nxt.add(0);

nxt.add(1);

for (int i=0; i<nxt.size(); i++)

{

a[i] = nxt.get(i);

}

return a;

}

char[] p = ps.toCharArray();//将模式串转换为模式数组

nxt.add(0);

nxt.add(1);

for (int i=2; i<p.length; i++){//采用由next(i-1)求next(i)的方法

int k = nxt.get(i-1);

while (k!=0){//当nxt.get(i-1)等于0时,代表已经回溯到了next数组的第一个元素

if (p[i-1] == p[k-1]){//因为数组是从0开始计数的,所以这里需要k-1

nxt.add(k+1);

break;

}else {

k = nxt.get(k-1);//p[k-1]与nxt.get(k-1)相对应

}

}

if (k==0){

nxt.add(1);

}

}

for (int i=0; i<nxt.size(); i++)

{

a[i] = nxt.get(i);

}

return a;

}

public static Boolean KMP(String a,String b){

int[] nxt = kmpNext(b);

while (i<a.length()&&j<b.length()){

if (a.charAt(i) == b.charAt(j)){//如果比较的两位都相等的话,i++,j++

i++;

j++;

}else if (j==0 &&a.charAt(i) != b.charAt(j)){//如果j=0,代表指向模式串的第一个元素,此时若比较的两个元素不相等的话,则i++,j无需++

i++;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值