kmp算法(java模板)

kmp算法

kmp算法为解决BF算法的缺点提出了更好的解决方法, 理解不了最好的办法就是背一背

kmp算法的原理参考

b站的kmp原理解析


求next数组模板(java)

public static int[] kmpNext(String dest) {
		//创建next数组
		int[] next = new int[dest.length()];
		next[0] = 0;
		//i从1开始 j从0开始
		for(int i =1,j =0;i<dest.length();i++) {
			//while 的情况 j> 0  将j-1位置的next数组值赋值给j
			while(j>0 && dest.charAt(i) != dest.charAt(j)) {
				j = next[j-1];
			}
			//相等一律j++
			if(dest.charAt(i) == dest.charAt(j)) {
				j++;
			}
			//最后记得赋值
			next[i] = j;
		}
		return next;
	}

kmp的算法模板(java)

public static int kmp(String S,String dest,int[] next) {
		//遍历长字符串
		for(int i =0,j=0;i<S.length();i++) {
			//i和j都从0开始  //while不相同返回 j = next[j-1];
			while(j>0 && S.charAt(i) !=dest.charAt(j)) {
				j = next[j-1];
			}
			//如果字符相同 j++
			if(S.charAt(i) == dest.charAt(j)) {
				j++;
			}
			//如果j==目标长度 相当于大于下标
			//返回 i-j+1	
			if(j == dest.length()) {
				return i-j+1;
			}
		}
		return -1;
		
		
	
	}

源码及测试

public class KMPalgorithm {
	public static void main(String[] args) {
		String S ="ASDASFDASFASDADADADAS";
		String dest = "DASFA";
		System.out.println(kmp(S,dest,kmpNext(dest)));
	}
	
	
	public static int kmp(String S,String dest,int[] next) {
		//遍历长字符串
		for(int i =0,j=0;i<S.length();i++) {
			//i和j都从0开始
			while(j>0 && S.charAt(i) !=dest.charAt(j)) {
				j = next[j-1];
			}
			//相等 j++
			if(S.charAt(i) == dest.charAt(j)) {
				j++;
			}
			//如果j==目标长度 相当于大于下标
			//返回 i-j+1
			if(j == dest.length()) {
				return i-j+1;
			}
		}
		return -1;
		//如果相同 j++
		//while不相同返回 j = next[j-1];
		//如果j== dest的长度 返回 i-j+1
	}
	public static int[] kmpNext(String dest) {
		//创建next数组
		int[] next = new int[dest.length()];
		next[0] = 0;
		//i从1开始 j从0开始
		for(int i =1,j =0;i<dest.length();i++) {
			//while 的情况 j> 0
			while(j>0 && dest.charAt(i) != dest.charAt(j)) {
				j = next[j-1];
			}
			//相等一律j++
			if(dest.charAt(i) == dest.charAt(j)) {
				j++;
			}
			//最后记得赋值
			next[i] = j;
		}
		return next;
	}
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值