关于编辑距离的再次认识

 

定义​f[i][j]​为word1前i个字符到word2的前j个字符的转化的最小步。

接着,我们来考虑状态转移方程。

  • 假设对于​f[i][j]​以前的之都已知,考虑fi的情形。
  • 若​word1[i] = word2[j]​,那么说明只要word1的前i-1个能转换到word2的前j-1个即可,所以 ​f[i][j] = f[i-1][j-1]​
  • 反之,若不等,我们就要考虑以下情形了。
  • 给word1插入一个和word2最后的字母相同的字母,这时word1和word2的最后一个字母就一样了,此时编辑距离等于1(插入操作) + 插入前的word1到word2去掉最后一个字母后的编辑距离 ​f[i][j - 1] + 1​
  • 删除word1的最后一个字母,此时编辑距离等于1(删除操作) + word1去掉最后一个字母到word2的编辑距离 ​f[i - 1][j] + 1​
  • 把word1的最后一个字母替换成word2的最后一个字母,此时编辑距离等于 1(替换操作) + word1和word2去掉最后一个字母的编辑距离。为​f[i - 1][j - 1] + 1​
  • 三者取最小值即可。

 

复制代码
pattern, target = "book", "d7fh"
m, n = len(pattern), len(target)
dp = [[0]*n for _ in range(m)]   
# dp[i][j]表示第一个字符的前i个字符到第二个前j个字符需要的最小操作数
# word1后面插入一个就和word2相等:word1插入前(i-1)到word2(j)的编辑距离+1,即dp[i-1][j] + 1
# word1和word2删除一个字符相等:word1(i)到word2删除前(j-1)的编辑距离+1,即dp[i][j-1] + 1
# word1和word2替换最后一个字符相等:不产生相对位置移动,只是在各自前一个字符上最小操作数加1,及dp[i-1][j-1] + 1
for i in range(m):
    dp[i][0] = i
for j in range(n):
    dp[0][j] = j
for i in range(m):
    for j in range(n):
        if pattern[i] == target[j]:
            dp[i][j] = dp[i-1][j-1]
        else:
            dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1)
print(dp[m-1][n-1])
复制代码

 

posted @   今夜无风  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示