字符串Hash的一个板子题的思考

今天学到了字符串Hash,我觉得相对于kmp算法来说,字符串hash通过子串的hash值之间进行比较,字符串哈希适用于频繁比较和查找字符串的场景,例如判定两个字符串是否相等、判断字符串是否存在等。KMP算法适用于需要在一个字符串中寻找另一个字符串的出现位置的场景,例如查找关键字、实现字符串匹配等,对于复杂度来说,字符串hash的字符串比较通常在于O(1),但是有hash冲突,所以并不稳定,kmp算法虽然有O(n + m)(ps:n,m分别为源,模式字符串的长度),但是较为稳定。

字符串hash的整体框架

typedef unsigned long long ull;
const int base =131 //base一般为一个质数
 ull h[N];//h[i]表示s[1-i]的Hash(类似前缀和)
char s[N];
for(int i=1;i<=n;++i)h[i]=h[i-1]*base + s[i] - 'a'+1;
//获取子串s[l] - s[r]的Hash
ull getHash(ull h[],int l,int r)
{
    return h[r] -  h[l-1] * b[r-l + 1];b[i]表示base的i次方(预处理)
}

本题是一个计算源字符串通过每一位转换为自己的对立大小写(不知道咋说,a变为A,B变为b),再通过字符串hash计算目标字符串的hash值,再通过二分的操作计算源字符串子串的hash值与目标的进行匹配,更新匹配的长度,看是否符合题目要求即可输出,具体题目链接如下:

https://www.lanqiao.cn/problems/5132/learning/?page=1&first_category_id=1&name=%E5%A5%91%E5%90%88%E5%8C%B9%E9%85%8D

你可能感兴趣的:(哈希算法,算法,散列表)