力扣28题记录C语言rk算法(滚动hash)

记录的都是做题时的解法这是力扣题,实现strStr(),有很多方法,C语言自带的strstr()函数,BF(暴力匹配),KMP,RK,来记录下RK 。

// rk
#include<stdio.h>
#include<string.h>
int rk(char *s, char *pa){
	unsigned long skey = 0, pakey = 0, base = 1;  
	int slen = strlen(s);
	int palen = strlen(pa);
	for(int i = 0; i < palen; i++){    //计算初始的hash值
		pakey = pakey * 26 + pa[i] - 'a';
		skey = skey * 26 + s[i] - 'a';
		base *= 26;   //base 就是记录模式串第一个字符的次数 比如 ‘cba’ base = pow(26,2)
	}
	int left = 0, right = palen - 1;
	while(right < slen){  // 从第一个依次匹配
		if(skey == pakey){
			return left;
		}
		++right; 
		skey =  skey * 26 - (s[left] - 'a') * base + s[right] - 'a';
		++left;
	}
	return -1;
} 
int main()
{
	char s[]="fhiuwehuewhdhuiqwgdyugqwudguqdfuwqudyguyqwgduq";
	char pa[]="wehuewh";
	printf("%d\n",rk(s,pa));
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值