标签:info 题意 height self margin for cat class 每日一题
动态规划
思路:
用dp[i][j]表示A的前 i 个字母和B的前 j 个字母之间的编辑距离。
则边缘部分dp[i][0] = i ,dp[0][j] = j ,因为要把A的前i个字母变成B的前0个字母也就是空串需要删除A的i个字母即可。同理要把A的空串变成B的前j个字母,需要在A中添加B的前j个字符即可。
下面建立dp[i][j]的状态转移方程,根据题意dp[i][j]可由三种方式得到:
①dp[i][j] = dp[i][j-1]+1 , 因为dp[i][j-1]表示A的前i到B的前j-1编辑距离,那么只需要在A中的i+1的位置添加B的第j个字母即可。
例如: A:cat B:cats
dp[3][3] = 0 dp[3][4] = dp[3][3]+1 = 1 (A前3个字母cat变成B前4个字母cats,只需要在后面加个e即可)
②dp[i][j] = dp[i-1][j]+1 , 因为dp[i-1][j]表示A的前i-1到B的前j编辑距离, 那么只需要在A中删除第i个位置字母即可。
例如: A: cat B:cats
dp[2][2] = 0 dp[3][2] = dp[2][2] +1 = 1 (A的前3个字母cat变成B前2个字母ca,只需删除A的第3个字母t即可)
③如果A[i] = B[j] , 则dp[i][j] = dp[i-1][j-1],因为如果A第i个字母和B第j个字母相等,那么只需要讨论A的前i-1如何变成B的前j-1即可。
例如: A:cat B:cats
A[3]=B[3]=t ,dp[3][3] = dp[2][2] = 0
如果A[i] != B[j],则dp[i][j] = dp[i-1][j-1]+1, 因为如果A第i个字母和B第j个字母相等,那么只需要在A的前i-1和B的前j-1编辑匹配的基础上,将A的第i个字母替换为B的第j个字母即可。
由于要找到最小的编辑距离只需要取三种方式中的最小值即可 min(①,②,③)
代码:
class Solution: def minDistance(self, word1: str, word2: str) -> int: n = len(word1) m = len(word2) if n * m == 0: return n + m D = [ [0] * (m + 1) for _ in range(n + 1)] for i in range(n + 1): D[i][0] = i for j in range(m + 1): D[0][j] = j for i in range(1, n + 1): for j in range(1, m + 1): left = D[i - 1][j] + 1 down = D[i][j - 1] + 1 left_down = D[i - 1][j - 1] if word1[i - 1] != word2[j - 1]: left_down += 1 D[i][j] = min(left, down, left_down) return D[n][m]
标签:info 题意 height self margin for cat class 每日一题
原文地址:https://www.cnblogs.com/nilhxzcode/p/13092344.html