📜  字符串哈希 - C++ (1)

📅  最后修改于: 2023-12-03 15:25:03.192000             🧑  作者: Mango

字符串哈希 - C++

简介

字符串哈希是一种将字符串转换为数字的算法,并且能够在O(1)时间内进行字符串比较。常用于字符串匹配及字符串相等性判断。

实现

以下是使用C++实现字符串哈希的代码:

const int base = 131; //尽量选取一个质数,避免哈希冲突
const int maxn = 100010;
unsigned long long h[maxn], p[maxn]; //h表示前缀哈希值,p表示幂次

void init()
{
    p[0] = 1;
    for(int i = 1; i < maxn; i++)
    {
        p[i] = p[i-1] * base; //预处理幂次
    }
}

void Hash(char s[])
{
    int len = strlen(s);
    h[0] = 0;
    for(int i = 1; i <= len; i++)
    {
        h[i] = h[i-1] * base + s[i-1]; //计算前缀哈希值
    }
}

unsigned long long getHash(int l, int r)
{
    return h[r] - h[l-1] * p[r-l+1]; //计算[l,r]的哈希值
}
使用场景

字符串哈希常用于字符串匹配和字符串相等性判断。例如,可以使用字符串哈希来解决LeetCode的字符串同构问题。

注意事项
  1. 哈希冲突:尽量选取一个质数作为base值,可以避免大部分哈希冲突导致的错误。
  2. 效率问题:哈希算法虽然能够在O(1)时间内进行字符串匹配和比较,但是计算哈希值的时间复杂度为O(n),如果哈希值的计算次数过多会导致程序运行效率下降。因此,在具体场景下要仔细权衡是否需要使用字符串哈希。