583. Delete Operation for Two Strings 72. Edit Distance

583. Delete Operation for Two Strings

Given two strings word1 and word2, return the minimum number of steps required to make word1 and word2 the same.

In one step, you can delete exactly one character in either string.

1. dpij: the minimum number of times to deleted a letter。

the string word1 that ends in i-1

the string word2 that ends in j-1

2. recursive formula

When word1i - 1 and word2j - 1 are the same

When word1i - 1 and word2j - 1 are not the same

When word1i - 1 is the same as word2j - 1, dpij = dpi - 1j - 1;

When word1i - 1 is not the same as word2j - 1, there are three cases:

Case 1: delete word1i - 1, the minimum number of operations is dpi - 1j + 1

Case 2: delete word2j - 1, the minimum number of operations is dpij - 1 + 1

**Case 3:**delete word1i - 1 and word2j - 1 at the same time, the minimum number of operations for dpi - 1j - 1 + 2

then finally of course the minimum value, so when word1i - 1 and word2j - 1 are not the same, recursive formula: dpij = min({dpi - 1j - 1 + 2, dpi - 1j + 1, dpij - 1 + 1});

Since dpij - 1 + 1 = dpi - 1j - 1 + 2, the recursive formula can be simplified to

dpij = min(dpi - 1j, dpij - 1) + 1;

DP:

Time complexity: O(m x n)

Space complexity: O(m x n)

python 复制代码
class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        m = len(word1)
        n = len(word2)

        dp = [[0] * (n + 1) for _ in range(m + 1)]

        for i in range(m + 1): # m+1 不是 m
            dp[i][0] += i
        for j in range(n + 1):
            dp[0][j] += j
        
        for i in range(1, m + 1):
            for j in range(1, n + 1):
                if word1[i - 1] == word2[j - 1]:
                    dp[i][j] = dp[i - 1][j - 1]
                else:
                    dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1#dp[i][j] = min(dp[i-1][j-1] + 2, dp[i-1][j] + 1, dp[i][j-1] + 1)
        
        return dp[-1][-1]

72. Edit Distance

Given two strings word1 and word2, return the minimum number of operations required to convert word1 to word2.

You have the following three operations permitted on a word:

  • Insert a character
  • Delete a character
  • Replace a character

recursive formula:

if (word1i - 1 == word2j - 1)

不操作 dpij = dpi - 1j - 1

if (word1i - 1 != word2j - 1)

增 dpij = dpi - 1j + 1,dpij = dpij - 1 + 1 Adding an element to word2 is equivalent to removing an element from word1

删 dpij = dpi - 1j + 1,dpij = dpij - 1 + 1

换 dpij = dpi - 1j - 1 + 1

DP:

Time complexity: O(m x n)

Space complexity: O(m x n)

python 复制代码
class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        m = len(word1)
        n = len(word2)

        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
        
        for i in range(1, m + 1):
            for j in range(1, n + 1):
                if word1[i - 1] == word2[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[-1][-1]
相关推荐
forest_091 小时前
多 Agent 协作第二课:交叉验证≠独立验证
人工智能·python·算法·机器学习·prompt·agi
纪念 2292 小时前
C++ 算法基础 (差分)
开发语言·c++·算法
jyOverQ5 小时前
从零学 JVM(六):垃圾回收算法详解——标记清除、标记复制与标记整理
jvm·算法
严肃小白兔7 小时前
第 06/24 期:神经网络的反向传播算法:从链式法则到梯度计算
人工智能·神经网络·算法
落羽的落羽8 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
【心态好不摆烂】8 小时前
数据结构基础精讲3
数据结构·算法
漂流瓶jz9 小时前
UVA-1613 K度图的着色 题解答案代码 算法竞赛入门经典第二版
算法·深度优先·图论·贪心·aoapc·算法竞赛入门经典·uva
Pniubi10 小时前
动态规划入门 ( - 力扣509斐波那契数)
算法·动态规划
吴长建先生重名了11 小时前
GitHub Actions部署报表系统踩坑记:幂等性与限
算法