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]
相关推荐
垆边人似月.1 分钟前
任务混部(200 分档)
算法
言乐67 分钟前
Python区分广度优先深度优先宽度优先的区别
python·算法·深度优先·广度优先·宽度优先
如意猴25 分钟前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
朝朝辞暮i28 分钟前
C++ 第 32 课:main()、rclcpp::init()、spin()、shutdown()
开发语言·c++·算法
朝朝辞暮i2 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
Evand J3 小时前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
海绵宝宝转agent4 小时前
leetCode100算法开源笔记分享
笔记·算法
写后端的胖头鱼4 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
hahaha60164 小时前
黑体轨迹和色温--光源白点
人工智能·嵌入式硬件·算法·计算机视觉
海绵宝宝转agent4 小时前
基于Redis ZSet+AOP+注解实现限流注解算法
数据库·redis·算法