字符串匹配——Sunday算法

字符串匹配算法中最先学的算法是暴力算法,紧接着是KMP算法,到现在依旧没有理解next到底是怎么求的

寻找到了一种新的算法——Sunday算法,比KMP算法更快

匹配时关注匹配主串中参与匹配的最后一位字符的下一位字符。

参考:https://www.jianshu.com/p/2e6eb7386cd3?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

#include<iostream>
#include<string>
using namespace std;

int sunday(string part,string total){
	int psize=part.size();  //模式串的长度
	int tsize=total.size();  //主串的长度
	
	int move[126];   //长度为ASCII码的长度,记录如果匹配到这个字符的话要移动多少位
	for(int i=0;i<126;i++){  //对于未出现在模式串中的字符,直接跳过全部,移动长度为模式串长度+1
		move[i]=psize+1;
	}
	for(int i=0;i<psize;i++){   //对于出现在模式串中的字符,移动的长度对应模式串中最后一次出现此字符的情况
		move[part[i]]=psize-i;
	}
	
	int s=0;  //s为模式串匹配主串时首字符在主串中的位置
	int j;   //j为模式串已经匹配主串的长度
	while(s<tsize-psize){   //防止越界
		j=0;  //重新开始匹配
		while(part[j]==total[s+j]){   //如果匹配成功
			j++;  //继续匹配下一个字符
			if(j>=psize) return s;    //匹配结束的话返回模式串在主串中的位置
		}
                //跳跃
		//s+psize 模式串匹配的下一个字符的位置 
		//total[s+psize] 下一个字符的值
		//move[total[s+psize]] 需要移动的距离 
		s+=move[total[s+psize]];   //匹配失败则关注之后的字符
	}
	return -1;
} 



int main(){
	string a="dasc";
	string b="asbdascddd"; 
	cout<<sunday(a,b);
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值