动态规划之编辑距离

这篇博客探讨了一个使用动态规划算法解决编辑距离问题的实例。编辑距离是指通过插入、删除、替换操作将一个字符串转换为另一个字符串所需的最少步骤数。作者详细介绍了算法思路,包括状态转移方程和基础情况,并提供了一个具体的Python实现。通过理解这个算法,读者可以提升自己的逻辑思维能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hard题,看上去就挺可怕的,仔细一想想觉得很清晰,希望自己早日能达到这种逻辑。

题目🔗

算法思路

题解思路链接🔗

  •  状态:
    • dp[i, j]   i代表【0,i】的word1 j代表【0,j】的word2 dp[ i ][ j ]表示word1[ 0 : i ] 和word2[ 0 : j ]
  • 选择:
    • 插入一个字符串    dp[ i ][ j - 1 ] + 1
    • 删除一个字符串    dp[ i - 1 ][ j ] + 1
    • 替换一个字符串    dp[ i - 1 ][ j - 1 ] + 1
    •  跳过啥都不做       dp[ i - 1 ][ j - 1 ]
  • 状态转移方程:
    • dp[i][j] =  
      • if  word1[i]==word2[j]     跳过 --> dp[i-1]dp[j-1]
      • else  进行相应操作  --> min(插入, 删除, 替换)--> min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1])
  • base case:
    •  由于i , j 应该初始化成-1才对,但是数组下表从0开始,所以以0为base case dp向右偏移了一位, 所以dp的大小也要大一位
class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        # 状态dp[i, j],  i代表【0,i】的word1 j代表【0,j】的word2 dp[i][j]表示word1[0:i] 和word2[0:j]
        # 选择: 1. 插入一个字符串 2. 删除一个字符串 3. 替换一个字符串 4. 跳过啥都不做
        # 状态转移方程 dp[i][j] =  if word1[i]==word2[j]  跳过 --> dp[i-1]dp[j-1]
        #                        else  进行相应操作  --> min(插入, 删除, 替换)--> min(dp[i][j-1], dp[i-1][j], dp[i-1]dp[j-1])
        
        # base case 由于i,j应该初始化成-1才对 但是数组下表从0开始 所以以0为base case dp向右偏移了以为 所以dp的大小也要大一位
        
        n, m = len(word1), len(word2)
        dp = [[0]*(m+1) for i in range(n+1)]
        
        # base case
        for i in range(1,n+1):
            dp[i][0] = i  # 注意这里别写错啦
        for j in range(1,m+1):
            dp[0][j] = j
        
        # begin
        for i in range(1, n+1):
            for j in range(1, m+1):
                if word1[i-1] == word2[j-1]: # 注意这里偏移了一位!
                    dp[i][j] = dp[i-1][j-1]  # 啥也不做
                else:
                    dp[i][j] = min([dp[i][j-1], dp[i-1][j], dp[i-1][j-1]])+1 # 注意这里操作数+1
                    
        return dp[n][m]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值