动态规划

字符串

  • 编辑距离

    难度:中等

    给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
    你可以对一个单词进行如下三种操作:
    插入一个字符
    删除一个字符
    替换一个字符

    示例 1:
    输入:word1 = “horse”, word2 = “ros”
    输出:3
    解释:
    horse -> rorse (将 ‘h’ 替换为 ‘r’)
    rorse -> rose (删除 ‘r’)
    rose -> ros (删除 ‘e’)

    示例 2:
    输入:word1 = “intention”, word2 = “execution”
    输出:5
    解释:
    intention -> inention (删除 ‘t’)
    inention -> enention (将 ‘i’ 替换为 ‘e’)
    enention -> exention (将 ‘n’ 替换为 ‘x’)
    exention -> exection (将 ‘n’ 替换为 ‘c’)
    exection -> execution (插入 ‘u’)

  • 方法一

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
    n = len(word1)
    m = len(word2)
    if m*n==0:
    return m+n
    dp = [[0]*(n+1) for _ in range(m+1)]
    for i in range(n+1):
    dp[0][i]=i
    for i in range(m+1):
    dp[i][0]=i
    for i in range(1,m+1):
    for j in range(1,n+1):
    l=dp[i][j-1]+1
    d=dp[i-1][j]+1
    ld=dp[i-1][j-1]
    if word1[j-1]!=word2[i-1]:
    ld+=1
    dp[i][j]=min(l,d,ld)
    return dp[m][n]

    解析

    复杂度分析
    时间复杂度 :O(mn),其中 m 为 word1 的长度,n 为 word2 的长度。
    空间复杂度 :O(mn),我们需要大小为 O(mn) 的 D 数组来记录状态值。