动态规划

73 阅读1分钟

DNA序列编辑距离

image.png

线性动态规划

f(i,j)f(i,j)为dna1前i个字符和dna2的前j个字符相等的最小编辑步骤

f(i,j)=min(f(i1,j),f(i,j1),f(i1,j1))+1f(i,j) = min(f(i-1,j), f(i,j-1), f(i-1,j-1)) + 1s[i1]!=s[j1]s[i-1] != s[j-1]

f(i,j)=f(i1,j1)f(i,j) = f(i-1,j-1) 此时 s[i1]==s[j1]s[i-1] == s[j-1] 不需要进行编辑

def solution(dna1, dna2):
    n = len(dna1)
    m = len(dna2)
    
    f = [[0] * (m + 1) for _ in range(n + 1)]
    
    # 初始化边界条件
    for i in range(n + 1):
        f[i][0] = i
    for j in range(m + 1):
        f[0][j] = j
    
    # 动态规划计算编辑距离
    for i in range(1, n + 1):
        for j in range(1, m + 1):
            if dna1[i - 1] == dna2[j - 1]:
                f[i][j] = f[i - 1][j - 1]
            else:
                f[i][j] = min(f[i - 1][j] + 1, f[i][j - 1] + 1, f[i - 1][j - 1] + 1)
    
    return f[n][m]

if __name__ == "__main__":
    # 你可以添加更多的测试用例
    print(solution("AGCTTAGC", "AGCTAGCT") == 2)
    print(solution("AGCCGAGC", "GCTAGCT") == 4)