字符串算法_字符串哈希
原文:https://oi-wiki.org/string/hash/
字符串哈希
方法以,M进制的形式来表示一个字符串,那么这个字符串就可以轻松计算 i~j 之间的hash值
当只有小写/大家字母时,M=131 而hash值,可以使用unsigned long long 来表示,这时不再需要求余
方法应用
- 字符串匹配。思路:对比hash值
- 允许k次失配的字符串匹配 。即:允许k次字符值不对的情况下仍然匹配。思路:使用 哈希二分来解决
- 最长回文子串。 顺着/倒着计算hash值。设Ri为以i为结尾的字符串的最长回文子串,则有 Ri<=R(i-1)+2;
- 确定字符串中不同子字符串的数量。思路:n*n遍历计算 i:起始点 len 长度 查找hash值有多少个不一样,则为结果
核心代码
#define NMAX 1000005
#define ull unsigned long long
#define MAGICNUM 131
char szStr[NMAX];
ull f[NMAX];
ull p[NMAX];
void initHash(const char* szStr){
int len = strlen(szStr);
p[0] = 1;
for( int i=0;i<len;++i){
int dig = szStr[i] - 'a' + 1;
f[i+1] = f[i] * MAGICNUM + dig;
p[i+1] = p[i] * MAGICNUM;
}
}
//l/r 都是包含的,但是相较于cpp的index ,此值为 cpp的index+1 (即:从1开始)
ull getHash(int l,int r){
return f[r] - f[l-1] * p[r-l+1];
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?