【数据结构与算法】字符串匹配算法

本文深入探讨了字符串匹配算法,包括暴力匹配、KMP算法的详细思想与代码实现、KMP算法中的next数组优化。接着介绍了BM算法的核心概念——后向匹配、坏字符和好后缀规则。此外,还预告了Sunday算法和RK算法的内容。
摘要由CSDN通过智能技术生成

一、暴力匹配

	public static int worstMatch(String s, String p)  
	{  
	    int sLen = s.length();  
	    int pLen = p.length();  
	  
	    int i = 0;  
	    int j = 0;  
	    while (i < sLen && j < pLen)  
	    {  
	        if (s.charAt(i) == p.charAt(j)) 
	        {  
	            //如果当前字符匹配成功(即S[i] == P[j]),则i++,j++      
	            i++;  
	            j++;  
	        }  
	        else  
	        {  
	            //如果失配(即S[i]! = P[j]),s回退j步到匹配开始的位置,
	            //然后从下一位置重新开始,即i = i - j+1      
	            i = i - j + 1;  
	            j = 0;  
	        }  
	    }  
	    //匹配成功,返回模式串p在文本串s中的位置,否则返回-1  
	    if (j == pLen)  return i - j;  
	    return -1;  
	}

二、KMP算法

对于KMP算法,这篇博客讲解得非常透彻。KMP算法详解

1、KMP思想

总的思想:记录模式串中最长重复子串,只移动模式串,当发现不匹配字符时,模式串的指针尽可能少的回退到下一个可能匹配的位置。
例如匹配串s是ABCDEABCDEABCDFABCDE,模式串p是ABCDEABCDF,那么模式串p中F之前实际上有最长重复子串ABCD,所以当指针i移到s[9],指针j移到p[9]时,发现字符E和字符F不相等,则i不变j回退到4,下次匹配时直接比较s[9]和p[4]即可,而无须i回到1,j回到0。即当s[i]和s[j]不匹配时,j=next[9]=4。
那么如何得到next数组呢,假设已知next[i]=k,则p[0]、p[1]、p[2]、…、P[k-1]这前k个字符与p[i-k]、p[i-k+1]、p[i-k+2]、~、p[i-1]这后k个字符相同,那么计算next[i+1]时,我们只需要判断p[i]和p[k]两个字符就有可能确定next[i+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值