我在 Scala 中创建了Knuth-Morris-Pratt 算法的简单实现。现在我想变得花哨并以尾递归的方式做同样的事情。我的直觉告诉我这不应该太难(表格和搜索部分),但同样的感觉也告诉我,这一定是有人已经完成了,可能比我更聪明。因此问题。你知道 Knuth-Morris-Pratt 算法的任何尾递归实现吗?
object KnuthMorrisPrattAlgorithm {
def search(s: String, w: String): Int = {
if (w.isEmpty) {
return 0
}
var m = 0
var i = 0
val t = table(w)
while(m + i < s.length) {
if (w(i) == s(m + i)) {
if (i == w.length - 1) {
return m
}
i += 1
} else {
if (t(i) > -1) {
i = t(i)
m += i - t(i)
} else {
i = 0
m += 1
}
}
}
return -1
}
def table(w: String): Seq[Int] = {
var pos = 2
var cnd = 0
val t = Array(-1, 0) ++ Array.fill(w.size - 2)(0)
while (pos < w.length) {
if (w(pos - 1) == w(cnd)) {
cnd += 1
t(pos) = cnd
pos += 1
} else if (cnd > 0) {
cnd = t(cnd)
} else {
t(pos) = 0
pos += 1
}
}
t
}
}