字符串没法直接进行比较,但是数字可以直接进行比较,那我们能不能把字符串转换为数字并比较是否相等呢?答案事肯定的。但是求出其散列表相同的字符串并不一定就相同(如果用的是几何加减法),比如ac和ab,ac和ca,都是相同的。用其他的处理方法也极有可能出现不同字符串相同散列值的情况,所以我们需要对符合匹配的字符串进行检查。
class rabinkarp
{
private:
std::string pat;
long long pat_hash;
int m;
long long q = 2147483647;
int r = 256;
long long hash(std::string key, int m)
{
long long h = 0;
for (int j = 0; j < m; j++)
{
h = ( h + key[j]) % q;
}
return h;
}
bool check(std::string txt,int i)
{
for (int j = 0; j < m; j++)
{
if (txt[j + i] != pat[j])
{
return false;
}
}
return true;
}
public:
rabinkarp(std::string pat)
{
this->pat = pat;
this->m = pat.length();
pat_hash = hash(pat, m);
}
int search(std::string txt)
{
int n = txt.length();
long long txt_hash = hash(txt, m);
if (pat_hash == txt_hash)
return 0;
for (int i = m; i < n; i++)
{
txt_hash = (txt_hash + txt[i] - txt[i - m]);
printf("loop:%d %lld = %lld?\n",i, pat_hash, txt_hash);
if (pat_hash == txt_hash)
if(check(txt,i-m+1))
return i - m + 1;
}
}
};
运行结果
这是很巧妙的方法,对吧~?
|