给定两个字符串str1和str2,再给定三个整数ic、dc和rc分别代表插入、删除和替换一个字符的代价,返回将str1编辑成str2的最小代价。
【举例】
str1=“abc”,str2=“adc”,ic=5,dc=3,rc=2。
从“abc”编辑成“adc”,把’b’替换成’d’是代价最小的。所以返回2。
如果两个字符串一样,
不用编辑了,本来就是一样的字符串。所以返回0。
首先既然是str1变为str2,则dp矩阵纵列应该是str1 横列应该是str2,注意,填充0行 0列 作为空串,方便理解
比如
null a d c
null 5 10 15
a 0
b 3
c 6
这样既初始化完毕
思考dp[i][j]的意义
首选我们假设两个字符串 A B
两个字符串末尾字符分别为Ae Be 前面的子串位 Af Bf
Af Ae
Bf Be
要让A变成B,首先知道,我们能了解的只有Af这一块变为B的任意子集的信息(当然前提是按照行来初始化)
所以可以看到,在已知Af任意转换位B的子集的信息情况下,A变为B有三种可能
1 Af变为B 然后删除Ae
2 Af变为Bf 如果Ae不等于Be 替换
3A变为Bf 然后添加Be
以上就是这三种可能,所以状态转移方程为
dp[i][j]=min{dp[i-1][j]+delete_cost,dp[i-1][j-1]+exchange_cost,dp[i][j-1]+insert_cost}