用处:
- s1="ABABABABAAAA", s2="ABA" , 求s2在s1中相等字符串的位置
思路:
- 假设子串的长度为M,目标字符串的长度为N
- 计算子串的hash值
- 计算目标字符串中每个长度为M的子串的hash值(共需要计算N-M+1次)
- 比较hash值
- 如果hash值不同,字符串必然不匹配,如果hash值相同,还需要使用朴素算法再次判断
优化之处:
- 目标字符串的长度为N,算出哈希值,比较
- 然后向后移,减去第一个字符的哈希值在加上新移进的字符的哈希值
模板
// Rabin Karp Algorithm
#include<iostream>
#include<string>
using namespace std;
void Rabin_Karp_search(const string &T, const string &P, int d, int q)
{
int m = P.length();
int n = T.length();
int i, j;
int p = 0;
int t = 0;
int h = 1;
for (i = 0; i < m-1; i++)
h = (h*d)%q;
for (i = 0; i < m; i++)
{
p = (d*p + P[i])%q;
t = (d*t + T[i])%q;
}
for (i = 0; i <= n - m; i++)
{
if ( p == t )
{
for (j = 0; j < m; j++)
if (T[i+j] != P[j])
break;
if (j == m)
cout<<"Pattern found at index :"<< i<<endl;
}
if ( i < n-m )
{
t = (d*(t - T[i]*h) + T[i+m])%q;
if(t < 0)
t = (t + q);
}
}
}
int main()
{
string T = "Rabin–Karp string search algorithm: Rabin-Karp";
string P = "Rabin";
int q = 101;
int d = 16;
Rabin_Karp_search(T, P,d,q);
return 0;
}