动态规划-最小编辑距离

213 阅读1分钟

字符串s1通过插入、修改、删除三种操作最少能变换成字符串s2的次数

将两个字符串考虑成两个字符数组,即s1-->char[] char1 = s1.tocharArray。s2-->char[] char2 = s2.tocharArray

将问题转化为子问题:char1的前i个字符转换为char2的前j个字符所需要的最小次数

我们用二维数组表示上述子问题,dp[i][j]表示char1的前i个字符转换为char2的前j个字符所需要的最小次数。

  1. s1的第i个字符等于s2的第j个字符时,dp[i][j] = dp[i-1][j-1]
  2. 当s1的第i个字符不等于s2的第j个字符时,有三种选择,取三者的最小值即可(最小编辑距离)
  • 将s1的第i个字符替换成s2的第j个字符,dp[i][j] = dp[i-1][j-1]+1
  • 将s1的第i个字符去掉,dp[i][j] = dp[i-1][j]+1
  • 将s2的第j个字符去掉,dp[i][j] = dp[i][j-1]+1

下面考虑边界条件:

  1. 当s1是空字符串时,将s1转化为s2
  • dp[0][j] = dp[0][j-1]+1
  1. 当s2是空字符串时,将s1转化为s2
  • dp[i][0] = dp[i-1][0]+1

完整代码如下: