Description
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
Example 1:
1 | Input: word1 = "horse", word2 = "ros" |
Example 2:
1 | Input: word1 = "intention", word2 = "execution" |
解法
最开始的时候看到这道题是懵逼的,深呼吸,来分析以下具体情况。
假设从左往右进行字符串修改,如果A[i] == b[j],此时此刻,因为是从左向右修改的,那么,i之前的字符串与j之间的字符串已经匹配了,又因为i和j对应的字符相等,那么需要修改的次数就是i-1修改为j-1的次数。
如果A[i]!=B[j],此时题目中给出了三种修改方案,一种是直接删除字符,那么此时的修改次数就是修改i-1为j的次数+1(对应递归中i指针向后移一位),一种是插入新字符,那么此时的修改次数就是修改i为j-1的次数+1(对应递归中j指针向后移一位),一种是直接替换,那么此时的修改次数就是修改i-1为j-1的次数+1(对应递归中i,j指针往后移一位)。
维护一个二维的数组dp,其中dp(i,j)表示从word1的前i个字符转换到word2的前j个字符所需要的步骤。那我们可以先给这个二维数组dp的第一行第一列赋值,这个很简单,因为第一行和第一列对应的总有一个字符串是空串,于是转换步骤完全是另一个字符串的长度。我们可以举个例子来看,比如word1是“bbc”,word2是”abcd“,那么我们可以得到dp数组如下:
1 | Ø a b c d |
有递推公式:
1 | if word1[i - 1] == word2[j - 1] |
具体代码如下:
1 | class Solution { |
一般动态规划的题可以用递归来解,以下网上给出的递归方法,可以帮助我们理解dp公式。当然肯定是超时的:
1 | int minDistance(string word1, string word2) { |