字符串匹配与查找和两个字符串共同子串问题的计算时,有时会想到将字符串中字符看整数,计算一个子串的hash值,以字符串匹配为例,模式串P(长度为L),待匹配串S(长度为n):
1)计算P字符串的Hash值,时间复杂度O(L)
2)对于字符串S,计算S的长度为L的子串的Hash值,每个Hash值计算用时O(L),时间复杂度O(nL)
3)对于S的每个子串的Hash值与P字符串Hash值进行比较,如果匹配,则该子串和P字符串进行比较,时间复杂度O(L)
总共时间复杂度O(nL)。
对于上述计算的步骤2)可以通过使用RollingHash的方法来优化,对比相邻两个子串,可以看作,将前一个子串的头去掉,尾部加上下一个字符,两个子串的中间部分是相同的,可以构造一个多项式形式的Hash函数:
对于第0个子串的Hash值:
hash[0] = (S[0]*b^(L-1)+S[1]*b^(L-2)+...+S[L-2]*b^1+S[L-1]*b^0) mod M
对于第1个子串