KMP、BM、Sunday等字符串匹配算法及实现

本文介绍了KMP、BM、Sunday三种字符串匹配算法,通过学习和实践,理解它们的工作原理和优化策略。暴力字符串匹配效率较低,而KMP、BM、Sunday能有效提高匹配效率。KMP利用部分匹配值(NEXT数组)避免不必要的比较;BM算法通过坏字符规则和好后缀规则减少匹配步数;Sunday算法则结合了KMP和BM的思想。详细解析和实例可在参考链接中找到。
摘要由CSDN通过智能技术生成

发现字符串的匹配完全要考虑全面,如果考虑的情况不足够全面,就很可能出现这个例子可以运行,下一个例子的就行不通,毕竟匹配可能遇到各种各样的情况。本着可以实现效果就可以的原则,编的代码也实在是不优美,BM参考了别人的代码,因为写的精炼,按照自己的思路来写,然后发现有的可以运行,有的就达不到相应的效果。主要实现了暴力字符串匹配、KMP、BM、Sunday四种,几天的时间学习完的,回头再看的时候发现自己都有点忘记了,赶紧记下来~

暴力字符串匹配,效率比较低,因为对主串来说,模式串每次移动的位置都为一个单位。而其它的,KMP、BM、Sunday则是按照自己的原则尽可能的增大移动的位数。下面针对KMP、BM、Sunday简单的介绍

KMP

KMP主要是利用模式串本身的特点来计算出NEXT值,模式串中的每一个字符都有一个NEXT值,NEXT为整型数组,比如NEXT[i]就代表在模式串的第i个位置的部分匹配值,其实就是模式串和主串最后一个匹配位置的部分匹配值,i+1个位置两个串就不匹配了。利用已经匹配的长度减去部分匹配值就可以得到模式串的移动位数。其实大白话就是现在主串匹配的子串在模式串中是否还存在,在计算NEXT值时则是利用已经匹配模式串的前缀和后缀,求前缀和后缀的最大长度。NEXT值下标是从1开始的

文章http://blog.csdn.net/buaa_shang/article/details/9907183

public class KMP {

	
	public static void main(String[] args) {
		/*String str = "ababc";
		String orig ="abababc";*/
		String str = "abaabcac";
		String orig ="abcabaaabaabcac";
		/*String str = "aba";
		String orig ="aba";*/
		int[] next = get_Next(str);
		for(int i=0;i<str.length()+1;i++){
			System.out.print(next[i]);
		}
		System.out.println();
		KMP.search(orig, str, next);

	}
	//next[j]表示在当前模式串到T[j]遇到失配的情况,在模式串中重新和主串匹配的位置
	public static int[] get_Next(String str){
		
		//对str求出各个字符位置的部分匹配值
		int[] next = new int[str.length()+1];
		int j=0;
		next[0]=next[1]=0;
		for(int i=1;i<str.length();i++){
			while(j>0&&str.charAt(j)!=str.charAt(i))
				j=next[j];
			if(str.charAt(i)==str.charAt(j))j++;
			next[i+1]=j;
		}
		
		return n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值