Rabin-Karp滚动哈希

时间:2013-10-11 22:15:47

标签: java rabin-karp

在其中一个Coursera视频中,Rabin-Karp滚动哈希(http://en.wikipedia.org/wiki/Rolling_hash)显示为:

public static long getHash(String S)
{
    long H = 0;

    for (int i = 0; i < S.length(); i++)
        H = (H * 10 + S.charAt(i)) % 997;

    return H;
}

我认为这是错误的。我认为应该是:

public static long getHash(String S)
{
    long H = 0;

    for (int i = 0; i < S.length(); i++)
        H = (S.charAt(i) * (int)Math.pow(10, (S.length() - i - 1)) + H) % 997;

    return H;
}

哪一个是正确的,为什么?

1 个答案:

答案 0 :(得分:1)

你的可能不对,因为

(int)Math.pow(10, (S.length() - i - 1))

对于长度超过11个字符的任何字符串,将导致Integer.MAX_VALUE,第一个长度为11或长度为12个字符。例如,对于一个20个字符的字符串,当循环中的i == 0时,表达式为

(int)Math.pow(10, (20-0-1))

10 19 不适合int,所以演员的结果是2147483647