72. Edit Distance

Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2.
You have the following 3 operations permitted on a word:
Insert a character
Delete a character
Replace a character

很显然是dp的题,核心就是递推公式的寻找;
假设dp[i][j]表示将word1 [0,i] 部分修改到word2[0,j]部分的距离:
对于dp[i][j]考虑如下情况:
1.a[i] = b[j] :也就是说目标位置两个字符串相同,那我们只需要前面的修改次数就足够了, dp[i][j]=dp[i1][j1] d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ]
2. a[i]!=b[j] ,这种情况我们显然需要进行一些新的操作,根据题目我们有3种操作选项,这里举例子说明:
word1: acdx
word2: abdy

插入:我们可以在word1后面插入一个y,那么我们还需要在这之前将acdx转化成abd,也就是 dp[i][j-1] + 1

删除:也可以将word1的最后一位删掉,变成acd , 那么在这之前就是将word2转换成acd , 也就是dp[i-1][j] + 1;

修改:倘若我们已经将i,j前面的部分保持了一致,也就是已经完成了dp[i-1][j-1],那么这里我们得到了acdx , acdy,很显然我们只需要一步修改就可以让两个字符相同;
综合起来:

dp[i][j]=min(dp[i1][j],dp[i][j1],dp[i1][j1])+1; d p [ i ] [ j ] = m i n ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] , d p [ i − 1 ] [ j − 1 ] ) + 1 ;

注意这个问题我们的起始条件是dp[0][0] = 0,为了考虑空字符串的情况我们初始化为 dp[a.length+1][b.length+1] ,并且在执行真正的逻辑前对i==0 . j==0进行赋值(空string 对应 有字符string的长度);

你可能感兴趣的:(leetcode)