Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
解法:DP with O(N^2) Time and O(N^2) Space
双字符串统计min的问题,容易想到用DP解决。
假设dp[i][j] 表示前i个字符和前j个字符的子串,convert substr1 to substr2的minimum steps.
那么对于初始条件我们容易得到:
- dp[0][j] = j
- dp[i][0] = i
这里表示的是,如果其中一个是空字符,那么你要么插入j个字符或者删除j个字符,任何一种情况都是j个操作
当考虑状态方程的时候,要考虑i和j两位置上的字符是否相等,分两种情况:
1 charAt(i) == charAt(j)
当最后比较的字符相同时,有三种情况/操作可能出现
1 可能最小值来自于i - 1和j - 1的匹配,
2 或者是i - 1转为j的匹配,那么就要加上1表示从i字符串删除一位变为i - 1字符串的操作。
3 也可能是把i匹配为j - 1的字符串,然后最后加上第j个字符(insert操作)
dp[i][j] = Min(dp[i - 1][j - 1], dp[i - 1][j] + 1, dp[i][j - 1] + 1)
2 charAt(i) != charAt(j)
相类似于上面一种情况,唯一不同的是,dp[i - 1][j - 1]要加上1表示把第i位转化为第j位的操作
dp[i][j] = Min(dp[i - 1][j - 1] + 1, dp[i - 1][j] + 1, dp[i][j - 1] + 1)