字符串匹配算法之sunday算法

本节介绍一下sunday算法,看一下sunday算法是如何做的呢

首先定义连个字符串

src:abcdacdaahfacabcdabcdeaa

pattern:abcde

我们的目的就是在src串中查找pattern串是否存在,找的方法如下

1. 先左对齐,即从src[0]、pattern[0]开始,进行依次比较,比较结果如下

arc[0]=pattern[0] 比较成功

arc[1]=pattern[1] 比较成功

arc[2]=pattern[2] 比较成功

arc[3]=pattern[3] 比较成功

arc[4]!=pattern[4] 比较失败

2. 因为比较失败了,所以需要移动pattern,到底移动几个单位呢,看一下src[5],即下一个字符,

如果src[5]这个这个字符在pattern中,那么就将pattern中的字符跟他对齐,例子中src[5]=c,在pattern中有这个字符,pattern[2]=c。那么就移动5-2=3个长度。即现在src[3]与pattern[0]对齐。

如果src[5]这个字符串不在pattern中,那么就移动pattern长度+1个单位,即移动6个单位

3. 知道长度越界。

具体的实现代码如下

public static void main(String[] args) {

		char src[] = "abcdacdaahfacabcdabcdeaa".toCharArray();
	    char des[] = "abcde".toCharArray();
	    System.out.println(sunday(src, des));
	}

	/**
	 * 字符串匹配算法:sunday算法
	 *
	 * @param c1
	 * @param c2
	 * @return
	 */
	public static int sunday(char[] c1, char[] c2) {

		int olen = c1.length;
		int plen = c2.length;
		int maxSize = 255;
		int[] next = new int[maxSize];

		//1. next数组表示的是移动的为数,首先赋值为plen+1的长度,也就是默认移动plen+1的长度
		for(int i = 0; i < maxSize; i++) {
			next[i] = plen + 1;
		}
		//2. 那么什么情况下不移动plen+1的长度呢,就是c1的那个字符在c2中有的时候,那么就移动plen-i的长度
		for(int i = 0; i < plen; i++) {
			next[c2[i]] = plen - i;
		}

		int i = 0;	//c2在c1串的起始位置
		int j = 0;
		while(i <= (olen - plen)) {
			while(j < plen) {
				if(c1[i + j] != c2[j]) break;
				j ++;
			}
			if(j == plen) return i;
			//3. 注意c1[i+plen]表示的是字符,这个字符如果不在c2中,那么next的返回值就是plen+1,如果在
			//那么就看步骤2中的值来确定步长
			i += next[c1[i + plen]];
			j = 0;
		}
		return -1;
	}

字符串匹配算法之sunday算法

时间: 2024-08-26 16:11:06

字符串匹配算法之sunday算法的相关文章

字符串匹配算法之 ---- Boyer-Moore 算法

各种文本编辑器的"查找"功能(Ctrl+F),大多采用 Boyer-Moore算法 . Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解. 1977年,德克萨斯大学的Robert S. Boyer教授和J StrotherMoore教授发明了这种算法. 下面,我根据Moore教授自己的 例子 来解释这种算法. 1.假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE". 2. 首先,"字

字符串匹配算法的分析【转】

转自:https://www.cnblogs.com/adinosaur/p/6002978.html 问题描述 字符串匹配问题可以归纳为如下的问题:在长度为n的文本T[1...n]中,查找一个长度为m的模式P[1...m].并且假设T,P中的元素都来自一个有限字母集合?.如果存在位移s,其中0≤s≤n-m,使得T[s+1..s+m] = P[1..m].则可以认为模式P在T中出现过. 1. 朴素算法 最简单的字符串匹配算法是朴素算法.该算法最直观,通过遍历文本T,对每一个可能的位移s都比较T[

MySTL: BM算法和Sunday快速字符串匹配算法

BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J Strother Moore提出了另一种在O(n)时间复杂度内,完成字符串匹配的算法,这个算法在单模匹配上比KMP算法还要出色 PS:其BM算法在跳转优化上的确比KMP算法要好很多,能在O(N)的上界就完成匹配了,但是不是绝对的,我们讲到后面再来说这个问题. 我们知道,KMP算法之所以能那么快,是因为他

Sunday字符串匹配算法

逛ACM神犇的博客的时候看到的这个神奇的算法 KMP吧,失配函数难理解,代码量长 BF吧,慢,很慢,特别慢. BM吧,我不会写... 现在看到了Sunday算法呀,眼前一亮,神清气爽啊. 字符串匹配算法的效率大概是取决于在发生失配时如何进行下一步的问题. 其他咱就不说了. 这个Sunday算法在发生失配的时候,跳过了尽可能多的字符. 假设在发生不匹配时S[i]≠T[j],1≤i≤N,1≤j≤M.此时已经匹配的部分为u,并假设字符串u的长度为L.如图1.明显的,S[L+i+1]肯定要参加下一轮的匹

字符串模式匹配sunday算法

文字部分转自:http://www.cnblogs.com/mr-ghostaqi/p/4285868.html 代码是我自己写的 今天在做LeetCode的时候,碰到一个写字符串匹配的题目: https://oj.leetcode.com/problems/implement-strstr/ 我一看就懵了,字符串模式匹配我记得当时在上数据结构的时候,书上只写了BF和KMP算法,老师说考试“只可能会考BF”,KMP不要求掌握. 然后出于一颗探求的心,我还是看了一下KMP,这算法好难理解,于是就没

时空权衡之输入增强 ----字符串匹配算法Horspool算法和Boyer-Moore算法

在算法设计的时空权衡设计技术中,对问题的部分或者全部输入做预处理,对获得的额外信息进行存储,以加速后面问题的求解的思想,我们称作输入增强. 其中字符串匹配算法Horspool算法和Boyer-Moore算法就是输入增强的例子. 首先了解一下字符串匹配的概念.我们把在一个较长的n个字符的串中,寻找一个给定的m个字符的串的问题,称为字符串匹配问题.较长的串称为text,而需要寻找的串称为pattern. 字符串匹配问题的蛮力算法很好理解:我们把pattern与text第一个字符对齐,从左往右比较pa

字符串匹配算法KMP算法

数据结构中讲到关于字符串匹配算法时,提到朴素匹配算法,和KMP匹配算法. 朴素匹配算法就是简单的一个一个匹配字符,如果遇到不匹配字符那么就在源字符串中迭代下一个位置一个一个的匹配,这样计算起来会有很多多余的不符合的匹配做了冗余的比较.假设源字符串长n,字串长m 该算法最差时间复杂度为 m*(n-m+1),记为O(n*m);这里不做过多解释朴素匹配算法. KMP算法: kmp算法不是在源字符串中下手,他是从字串下手,比如我要在源字符串(acabaabaabcacaabc)中匹配一个字符串字串(ab

【算法设计与分析基础】19、字符串匹配算法

package cn.xf.algorithm.ch07inputEnhancement; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; /** * * 功能:字符串匹配算法,(还有一种叫KMP算法的,也是很经典的算法,就是比较复杂) * * 第一步:对于给定的长度为m的模式和在模式文本中用到的字母表,按照上面的描述构造移动表 * 第二步:将模式与文本的开

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

1.字符串匹配 字符串匹配是计算机的基本任务之一. 字符串匹配是什么?举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth(<计算机程序设计艺术>的作者). 2.KMP算法 这个算法不太容易理解,网上有很多解释,但