A刷题 DNA序列编辑距离 | 豆包MarsCode AI刷题

34 阅读3分钟
问题描述

小R是一位生物学研究者,他正在研究DNA序列的变异和修复机制。在这项研究中,他需要一个算法来计算将一个受损的DNA序列(记为dna1)转换成一个未受损的DNA序列(记为dna2)所需的最少编辑步骤。这里的编辑步骤包括三种操作:增加一个碱基、删除一个碱基或替换一个碱基。小R的目标是找到将受损序列恢复到未受损状态的最短路径,这在生物学研究和基因工程中具有重要意义。

给定两个字符串dna1dna2,小R需要计算出使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
思路解析

这个问题可以通过动态规划的方法来解决。我们可以创建一个二维数组dp,其中dp[i][j]表示将dna1的前i个碱基转换成dna2的前j个碱基所需的最少编辑步骤。我们可以通过比较dna1dna2的相应碱基来填充这个数组,如果它们相同,则不需要编辑步骤;如果不同,则需要考虑插入、删除或替换操作。

动态规划的状态转移方程如下:
  • 如果dna1[i-1]等于dna2[j-1],则dp[i][j] = dp[i-1][j-1](不需要额外步骤)。
  • 如果它们不相等,则dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1] + 1),分别对应插入、删除和替换操作。
最优方案

最优方案是构建一个动态规划表,通过填充这个表来找到从dna1dna2的最短编辑路径。这个表的构建过程是从两个序列的开始到结束,逐步计算每个位置的最小编辑步骤。

解题步骤
  1. 初始化一个大小为(len(dna1)+1) x (len(dna2)+1)的二维数组dpdp[i][j]表示dna1的前i个碱基到dna2的前j个碱基的最少编辑步骤。
  2. 填充dp的第一行和第一列,因为它们代表从一个空序列到另一个序列的编辑步骤。
  3. 遍历dna1dna2,使用状态转移方程填充dp表。
  4. dp[len(dna1)][len(dna2)]就是将dna1转换成dna2所需的最少编辑步骤。
复杂度分析

时间复杂度:O(len(dna1) * len(dna2))。我们需要填充一个二维数组,其大小与两个序列的长度成比例。

空间复杂度:O(len(dna1) * len(dna2))。动态规划表的大小与两个序列的长度成比例,因此空间复杂度也是二次的。如果空间是限制因素,可以考虑使用滚动数组的方法来优化空间复杂度。