题目:DNA序列编辑距离
题目描述
小R正在研究DNA序列,他需要一个函数来计算将一个受损DNA序列(dna1)转换成一个未受损序列(dna2)所需的最少编辑步骤。编辑步骤包括:增加一个碱基、删除一个碱基或替换一个碱基
测试样例
样例1:
输入:
dna1 = "AGT",dna2 = "AGCT"
输出:1
样例2:
输入:
dna1 = "AACCGGTT",dna2 = "AACCTTGG"
输出:4
样例3:
输入:
dna1 = "ACGT",dna2 = "TGC"
输出:3
样例4:
输入:
dna1 = "A",dna2 = "T"
输出:1
样例5:
输入:
dna1 = "GGGG",dna2 = "TTTT"
输出:4
题目分析
这是一个经典的动态规划问题。最小编辑步骤是指将字符串dna1转换成字符串dan2所需的最少操作次数,这些操作包括对dna1插入一个字符、删除一个字符或替换一个字符。
dp数组的含义
dp[i][j] 表示将 dna1 的前 i 个字符转换成 dna2 的前 j 个字符所需的最小编辑次数。
转移方程的含义
-
当
s1[i-1]==s2[j-1]时:表示如果当前字符相等,那么不需要进行任何编辑操作,即
dp[i][j] = dp[i - 1][j - 1]。 -
当
s1[i-1]!=s2[j-1]时:如果当前字符不相等,我们需要选择插入、删除或替换操作中的一个,使得编辑距离最小。即三种情况的最小值加1:
dp[i - 1][j] + 1:表示在dna1[i-1]的末尾插入一个字符使之匹配dna2的第j个字符。dp[i][j - 1] + 1:表示删除dna1[i]使之与dna2的前j-1个字符匹配。dp[i - 1][j - 1] + 1:表示将dna1的第i个字符替换为dna2的第j个字符。
因此,
dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1。
边界条件
dp[i][0] = i:表示将dna1的前i个字符转换成空字符串所需的最小编辑距离,需要删除所有i个字符,编辑距离为i。dp[0][j] = j:表示将空字符串转换成dna2的前j个字符所需的最小编辑距离,需要插入所有j个字符,编辑距离为j。
返回结果
dp[m][n],其中 m 和 n 分别是 dna1 和 dna2 的长度。