自学内容网 自学内容网

青训1_1105_02 DNA序列编辑距离(动态规划_不好理解)

青训1_1105_02 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

示例

def solution(dna1, dna2):
    # Please write your code here
    return -2

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution("AGCTTAGC", "AGCTAGCT") == 2 )
    print(solution("AGCCGAGC", "GCTAGCT") == 4)

思路(ERROR)

左->右,只有增加、删除、替换

思路(right)_我也不是很理解

1、创建(m+1)×(n+1)的dp数组,其中m和n分别是两个字符串的长度
2、初始化:
dp[i][0] = i (删除i个字符)
dp[0][j] = j (插入j个字符)

3、对于每个位置(i,j),考虑:
3.1 如果dna1[i-1] == dna2[j-1],则dp[i][j] = dp[i-1][j-1]
3.2 否则取三种操作的最小值:

替换: dp[i-1][j-1] + 1
插入: dp[i][j-1] + 1
删除: dp[i-1][j] + 1

答案

def solution(dna1, dna2):
    m, n = len(dna1), len(dna2)
    
    # 创建dp数组
    dp = [[0] * (n + 1) for _ in range(m + 1)]
    
    # 初始化第一行和第一列
    for i in range(m + 1):
        dp[i][0] = i
    for j in range(n + 1):
        dp[0][j] = j
        
    # 填充dp数组
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if dna1[i-1] == dna2[j-1]:
                dp[i][j] = dp[i-1][j-1]
            else:
                dp[i][j] = min(
                    dp[i-1][j-1] + 1,  # 替换
                    dp[i-1][j] + 1,    # 删除
                    dp[i][j-1] + 1     # 插入
                )
    
    return dp[m][n]

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution("AGCTTAGC", "AGCTAGCT") == 2 )
    print(solution("AGCCGAGC", "GCTAGCT") == 4)

原文地址:https://blog.csdn.net/qq_40266376/article/details/143533811

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!