这是一道经典的字符串动态规划问题,通常被称为编辑距离问题(Edit Distance)。以下是解题思路和 Python 代码示例:

解题思路:

考虑将 word1 转换成 word2 的过程,可以分为三种操作:

插入一个字符
删除一个字符
替换一个字符
假设 dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需要的最少操作数,则有以下状态转移方程:

当 word1[i] == word2[j] 时,dp[i][j] = dp[i-1][j-1]
否则,dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1,其中 dp[i-1][j] 表示删除一个字符,dp[i][j-1] 表示插入一个字符,dp[i-1][j-1] 表示替换一个字符。
最终的结果为 dp[m][n],其中 m 和 n 分别是 word1 和 word2 的长度。

Python 代码实现:

def minDistance(word1, word2):
    m, n = len(word1), 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
    
    # 递推计算dp[i][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], dp[i-1][j-1]) + 1
    
    return dp[-1][-1]

该函数的输入是两个字符串 word1 和 word2,输出为将 word1 转换成 word2 所使用的最少操作数。函数首先创建一个 m+1 行 n+1 列的动态规划表 dp,其中 dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需要的最少操作数。然后,该函数通过初始化 dp 的第一行和第一列,以及使用递推计算的方式,求出 dp[m][n] 即为将 word1 转换成 word2 所使用的最少操作数。

往右走是插入,往下走是删除,往对角线走是替换?

通常来说,动态规划中使用的状态转移方程可以表示为以下三种基本情况:

插入操作:在字符串中插入一个字符,通常是往右移动一格。
删除操作:从字符串中删除一个字符,通常是往下移动一格。
替换操作:将一个字符替换为另一个字符,通常是往对角线方向移动一格。
在编辑距离问题中,我们使用的是三种操作的组合。以将 word1 转换为 word2 为例:

插入操作:在 word1 中插入一个字符,相当于往 word2 的当前位置前面插入一个字符,此时需要将 word2 的下一个位置与 word1 的当前位置进行比较。
删除操作:从 word1 中删除一个字符,相当于将 word1 的下一个位置与 word2 的当前位置进行比较。
替换操作:将 word1 的当前位置的字符替换为 word2 的当前位置的字符,此时需要将 word1 的下一个位置与 word2 的下一个位置进行比较。
因此,在编辑距离问题中,可以使用往右走表示插入操作,往下走表示删除操作,往对角线走表示替换操作的方式来构建动态规划表。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐