这被称为Needleman-Wunsch 算法。它计算两个字符串之间的距离以及所谓的traceback,它允许您重建对齐方式。
由于这个问题在比较生物序列时主要出现在生物学中,因此该算法(和相关算法)在 R 包{Biostrings}中实现,它是Bioconductor的一部分。
由于这个包实现比简单的 Levenshtein 距离更通用的解决方案,不幸的是使用更复杂,使用小插曲也相应长。但您的基本用途如下:
library(Biostrings)
dist_mat = diag(27L)
colnames(dist_mat) = rownames(dist_mat) = c(letters, ' ')
result = pairwiseAlignment(
"abc abc", "abcde acc",
substitutionMatrix = dist_mat,
gapOpening = 1, gapExtension = 1
)
但是,这不会简单地为您提供 list c('b', 'c', 'c')
,因为该列表并不能完全代表此处实际发生的情况。相反,它将返回两个字符串之间的对齐方式。这可以表示为具有替换和间隙的序列:
score(result)
# [1] 3
aligned(result)
as.matrix(aligned(result))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
# [1,] "a" "b" "c" "-" "-" " " "a" "b" "c"
aligned(result)
— 对于第二个字符串中的每个字符,它提供原始字符串中的相应字符,将插入的字符替换为-
。基本上,这是将第一个字符串转换为第二个字符串的“秘诀”。请注意,它将仅包含插入和替换,而不包含删除。要获得这些,您需要以相反的方式执行对齐(即交换字符串参数)。