字符串匹配之朴素算法(暴力匹配)与KMP算法及如何求next数组(动画示例)(Java)

本文介绍了字符串匹配中的朴素算法和KMP算法。朴素算法通过两个指针进行暴力匹配,时间复杂度为O(mn)。KMP算法利用部分匹配表(next数组)减少匹配次数,时间复杂度为O(m+n)。详细解释了如何求解next数组,并通过实例演示了KMP算法的工作原理。
摘要由CSDN通过智能技术生成

一、朴素算法

    朴素算法就是最简单的暴力匹配算法,其步骤如下:

  1. 用两个指针 ij 分别指向主串和模式串的第一个字符。
  2. 如果当前主串和模式串的字符相等,则两个指针后移,i ++,j ++
  3. 如果当前主串和模式串的字符不相等,则 i 回到这一轮开始比较的字符的下一个字符 i - j + 1j 则归零 j = 0,指向模式串的第一个字符。
  4. 如果最终 j 等于模式串的长度,则返回主串第一次出现模式串的位置 i - j,否则返回 -1

    假设主串的长度为 m,模式串的长度为 n,则该算法的时间复杂度是 O(mn)

暴力匹配

	public static int violentSearch(String text,String pattern) {
   
		int i=0,j=0;
		while(i<text.length() && j<pattern.length()) {
   
			if(text.charAt(i)==pattern.charAt(j)) {
   
				i++;
				j++;   //两个字符串暂时相等,两个索引加一继续比较
			}else {
   
				i=i-j+1;   //不能直接加一
				j=0;   //两个字符串出现不相等的字符,模式串索引归零,主串索引指向原地方下一个字符
			}
		}
		if(j==pattern.length()) {
   
			return i-j;   //主串与模式串相等,返回B串第一次在A串出现的地方
		}
		return -1;
	}

二、KMP算法

    首先,用下面这个例子演示一下KMP算法是怎么工作的,如果看不懂可以先往下看。
KMP算法演示1
    在这里先解释一下什么是字符串的前缀和后缀。
    存在字符串A和B,如果A=BS,其中S是任

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值