字节跳动青训营|豆包MarsCode AI刷题之DNA序列编辑距离(JAVA版本)

99 阅读2分钟

题目: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 个字符所需的最小编辑次数。

转移方程的含义

  1. 当 s1[i-1]==s2[j-1] 时

    表示如果当前字符相等,那么不需要进行任何编辑操作,即 dp[i][j] = dp[i - 1][j - 1]

  2. 当 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 的长度。

代码演示(JAVA版)