KMP

35 篇文章 0 订阅
18 篇文章 0 订阅
本文介绍了一种改进的字符串匹配算法——KMP算法。通过构造next数组来避免传统BF算法中的大量回溯操作,显著提高了匹配效率。以ababcababa和ababa为例,详细展示了KMP算法的工作流程及其实现代码。
摘要由CSDN通过智能技术生成

与传统的字符串匹配(BF算法)相比,进行了进一步改进, 即做一个标记数组,使得每次匹配失败回溯的时候回溯到前面相同的部分。

ababcababa  和 ababa 进行匹配。 因为t 字符串有重复的部分,因此每次回溯时候不用完全回溯, 只回溯到next[j] 位置即可。 

P      a    b   a    b   a

j      0    1   2    3   4

next    -1   0   0    1   2


package KMP;

public class Solution {
	
	public int KMP(String s, String t){
		int[] next = new int[t.length()];
		nextGenerate(t, next);
		int i = 0;
		int j = 0;
		while(i < s.length()){
			if(j == -1 || s.charAt(i) == t.charAt(j)){
				i++;
				j++;
			}else{
				j = next[j];
			}
			if(j == t.length()){
				return i - j;
			}
		}
		return -1;
	}
	
	private void nextGenerate(String t, int[] next){
		next[0] = -1;
		for(int i = 1; i < t.length() - 1; i++){
			if(t.charAt(i) == t.charAt(next[i])){
				next[i + 1] = next[i] + 1;
			}else {
				next[i + 1] = 0;
			}
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Solution solution = new Solution();
		String s = "ababcababa";
		String t = "ababa";
		System.out.println(solution.KMP(s, t));

	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值