这个算法也是学习自七月算法,也请教了醉清风网友,非常感谢他的指点。通过构建矩阵的方式匹配。具体如下,整体与Java或C++版本在写法上没有本质区别,主要是熟悉了二元数组以及循环等。这个写法还有可以改进的地方,不过由于暂时没时间改了,等往后闲下来再修改(比如跟之前贴的算法一样,写成隐式转换,比如while循环写入def,还可以尝试用其他方式构造矩阵,比如列表数组、数组向量等)
object LCS extends App {
def main(args:Array[Int]) {}
def LCS(sub1:String, sub2:String) {
val opt = Array.ofDim[Int](sub1.length + 1, sub2.length + 1)
for (i <- 0 until sub1.length reverse) {
for(j <- 0 until sub2.length reverse) {
if (sub1(i) == sub2(j))
opt(i)(j) = opt(i + 1)(j + 1) + 1
else
opt(i)(j) = (opt(i + 1)(j).max(opt(i)(j + 1)))
}
}
println("sub1:" + sub1)
println("sub2:" + sub2)
print("LCS:")
var i = 0
var j = 0
while(i < sub1.length && j < sub2.length) {
if (sub1(i) == sub2(j)) {
print(sub1(i))
i += 1
j += 1
} else if (opt(i + 1)(j) >= opt(i)(j + 1))
i += 1
else
j += 1
}
}
val a = "abcfd"
val b = "bcfkjds"
LCS(a,b) //LCS:bcfd
}