字符串匹配——KMP算法详解

本文深入解析KMP算法的原理与应用,提供改进前后的代码对比,展示如何通过优化减少模式匹配过程中的比较次数,达到提高算法效率的目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

啊嘞...已经在word里准备好惹,但是感觉好像这里编辑器不太会用或者说不太完全...截图吧

内容基本上参考于第四版数据结构与算法(电子工业出版社)。断断续续研读了几天,自己理了一下。

 

 

 

 

好了,这是next改进之前的代码

package test;

public class KMP {
	public static void main(String[] args){
		String target = "abcdabcabbabcabc";
		String pattern = "abcabc";
		System.out.println(indexOf(target,pattern));
	}
	public static int indexOf(String target,String pattern){
		return indexOf(target,pattern,0);
	}
	
	public static int indexOf(String target,String pattern,int begin){
		//求出目标字符串和模式字符串的长度
		int n = target.length();
		int m = pattern.length();
		
		if(begin<0){
			begin = 0;
		}
		
		if(n == 0 || n < m || begin >= n){
			return -1;
		}
		
		int[] next = getNext(pattern);
		
		//用begin定义目标字符串中开始的位置i,模式字符串中从j=0开始比较
		int i = begin, j = 0;
		while(i < n && j < m){
			if(j == -1 || target.charAt(i) == pattern.charAt(j)){
				i++;
				j++;
			}else{
				j = next[j];
				if(n-i+1<m-j+1)
					break;
			}
		}
		if(j == m){
			return i-j;
		}
		return -1;
	}
	
	private static int[] getNext(String pattern){
		int j = 0,k  = -1;
		int next[] = new int[pattern.length()];
		next[0] = -1;
		while(j<pattern.length()-1){
			if(k == -1 || pattern.charAt(k) == pattern.charAt(j)){
				
				j++;
				k++;
				next[j] = k;
			}else{
				k = next[k];
			}
		}
		return next;
	}
}

改进之后

private static int[] getNext(String pattern){
		int j = 0,k  = -1;
		int next[] = new int[pattern.length()];
		next[0] = -1;
		while(j<pattern.length()-1){
			if(k == -1 || pattern.charAt(k) == pattern.charAt(j)){
				
				j++;
				k++;
				if(pattern.charAt(j) != pattern.charAt(k)){
					next[j] = k;
				}else{
					next[j] = next[k];
				}
				
			}else{
				k = next[k];
			}
		}
		return next;
	}

KMP算法最好情况比较次数为m,最坏情况比较次数为n+m。时间复杂度为O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值