我正在try 实现Rabin-Karp字符串匹配算法,以在字符串haystack
中找到字符串needle
(返回字符串haystack
的索引,其中找到了字符串needle
的匹配).我试图在干草堆abc
中找到针c
时出错了.
下面是运行我的代码在abc
中查找c
后的输出:
I:0处的hayHash:0和AndleHash:2删除:A和添加:B和新的哈希 是在判断底片之前:1
在I:1处的hayHash:1和AndleHash:2删除:B并添加:C和新的散列 是在判断底片之前:-50
HayHash:51和AndleHash:2
我搞不懂为什么最后一次散列重新计数结果是-50
,而不是hayHash
的2
.在这里,hayHash
和needleHash
都应该是只由char 'c'
组成的计算散列,并且两者的值应该相同.但我的代码是重新计算hayHash
到51
(在取消负值之前是-50
),而不是2
.
对于我的代码中可能存在的错误,有什么建议吗?
以下是我的代码:
private fun find(haystack: String, needle: String): Int {
if(needle.length > haystack.length) return -1
val q = 101
val d = 256
var needleHash = 0
var hayHash = 0
var hash = 1
for (i in 0..needle.length)
hash = (hash * d) % q
for(i in 0..needle.lastIndex) {
needleHash = (d * needleHash + (needle[i] - 'a')) % q
hayHash = (d * hayHash + (haystack[i] - 'a')) % q
}
for(i in 0..(haystack.length - needle.length)) {
println("hayHash: $hayHash and needleHash: $needleHash")
if(hayHash == needleHash) {
for(j in 0..needle.lastIndex) {
if(haystack[i + j] != needle[j])
break
if(j == needle.lastIndex)
return i
}
}
if(i == haystack.length - needle.length)
break
print("at i: $i remove: ${haystack[i]} and add: ${haystack[i + needle.length]}")
hayHash = (d * (hayHash - (haystack[i] - 'a') * hash) + (haystack[i + needle.length] - 'a')) % q
println(" and new hash is before checking for negatives: $hayHash")
if(hayHash < 0)
hayHash += q
}
return -1
}