编程语言
首页 > 编程语言> > Sunday算法

Sunday算法

作者:互联网

Sunday算法

此原理转自其他博客,侵立删
代码为自己写的,希望大家能看懂

原理介绍

Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似

只不过Sunday算法是从前往后匹配,在匹配失败时关注的是主串中参加匹配的最末位字符的下一位字符。

下面举个例子说明下Sunday算法。假定现在要在主串”substring searching”中查找模式串”search”。

算法实现

const int maxNum = 1005;	// 不同的字符个数
int shift[maxNum];	//下标是字符的int型数,对应的内容是该字符在模式串中最后出现的位置 

//Sunday算法 
int Sunday(string s1, string s2) {
	int len1 = s1.length();	//主串长度
	int len2 = s2.length();	//模式串长度 

	if (len1 < len2)
		return -1;

	//初始化shift数组,默认移动- 模式串长度+1 -长度
	for (int i = 0; i < maxNum; i++) {
		shift[i] = len2 + 1;
	}

	//根据模式串预处理shift数组 
	for (int i = 0; i < len2; i++) {
		shift[s2[i]] = len2 - i;
	}

	int i = 0;	//主串“指针” 
	int j;		//模式串“指针” 
	while (i <= len1 - len2) {
		j = 0;

		while (s1[i + j] == s2[j]) {
			j++;

			//当j等于s2的长度len2时,s1中有s2子串
			if (j == len2)
				return i;
		}

		//不匹配则根据shift数组更新i指针
		i += shift[s1[i + len2]];
	}

	//s1中找不到s2子串
	return -1;
}

标签:字符,匹配,int,算法,模式,len2,Sunday
来源: https://blog.csdn.net/qq_16665045/article/details/115103892