KMP字符串哈希-3.21

KMP算法

这是一种字符串匹配算法,用于匹配模式串P(短)在文本串S(长)中出现的所有位置。

字符串匹配是按匹配的第一个字母的位置来算,例如:S=“ababac”,P="aba",则出现的所有位置是1,3.

我们在初学KMP时,我们只需要记住和使用模板即可。

KMP算法将原本O(n^2)的字符串匹配算法优化到了O(n),可以说精髓在于next数组,它表示此时模式串下标失陪时应该移动到的位置,也表示最长的相同真前后缀的长度。

模板:

next数组仅与模式串P有关,计算数组的方式就是用P去匹配自己。

获得next数组:


char s[N],p[N];
int nex[M];
int n=strlen(s+1),m=strlen(p+1);//字符串下标都从1 
nex[0]=nex[1]=0;//初始化
for(int i=2,j=0;i<=m;++i)
{
	//不断匹配p[i]和p[j+1]
	while(j&&p[i]!=p[j+1])  j=nex[j];//失配 
	if(p[i]==p[j+1]) j++; //从while出来后要么j=0,要么p[i]==p[j+1].如果匹配,j后移
	nex[i]=j; //匹配失败就回到j,回到最初的地方重新开始匹配 
 } 
 

     匹配:

for(int i=1,j=0;i<=n;i++)
{
    while(j&& s[i]!=p[j+1])  j=nex[j];
    if(s[i]==o[j+1])  j++;
    if(j==m)  //成功匹配一次
}

例题1:

字符串Hash

基于进制的字符串hash本质是用一个数字表示一段字符串,从而降低字符串处理的复杂度。数字很多,因此使用 unsigned long long ,可以自然溢出。还需要一个进制数base,用于规定这个数字的进制。

hash数组h[i]表示字符串s[1~i] 的hash值,采用类似前缀和的形式求出任意一个字串的hash值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值