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]
相关推荐
happyprince14 小时前
01-整体观-Codex全貌解读(源码)
算法·ai编程
俊基科技15 小时前
别自己写算法了,让这颗37.5毫米的模组替你“闭嘴干活”
神经网络·算法·硬件开发·ai降噪·语音模块·回音消除
_Narcissus_15 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径
世人万千丶16 小时前
鸿蒙项目实战 - 社区活动编排板:标签云布局算法与自动换行
学习·算法·华为·harmonyos·鸿蒙
zander25816 小时前
LeetCode 279. 完全平方数
算法·深度优先
典典分享指南17 小时前
VS Code Git 工作树:解锁多分支并行开发新体验
算法·决策树·逻辑回归·启发式算法
_Narcissus_17 小时前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举
天疆说17 小时前
策略的进化:从随心所欲到稳健前行
算法
冻柠檬飞冰走茶17 小时前
《数据结构实验指导-C++语言版》 在顺序表 list 中查找元素 x
开发语言·数据结构·c++·算法·list