编辑距离推导,动态规划。
给定两个字符串s、t,用增加、删除、替换三种操作,使得s变成t的最少次数。
动态规划,dp[i][j]表示s前i个字符变为t的前j个字符的编辑距离。
初始化:dp[0][j] = j, dp[i][0] = i
递推分为两种情况:
s[i] == t[j]
dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1])
分别对应删掉s[i]再变为t,s变为t[0: j-1]再加上t[j],以及s[0: i-1]变为t[0: j-1]
但是,第一种情况可以改为直接将s[0: i-1]变为t,然后将t[j]去掉(因为s[i]还保留着),步数不变并且不少于s[0: i-1]变为t[0: j-1]。同理可证第二种情况的步数不少于s[0: i-1]变为t[0: j-1]。所以只需要从最后一种情况进行更新就行。
s[i] != t[j]
dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1] + 1)
分别对应删掉s[i]再变为t,s变为t[0: j-1]再加上t[j],以及s[0: i-1]变为t[0: j-1]再替换s[i]
C++ Code
1 | class Solution { |