问题描述
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[i][j]为word1[0,1…i-1]转化成word2[0,1…j-1]的最少操作次数。
则可以设定初始状态dp[0][j]=j(即word1为空时,转换成word2的步骤,一直insert)
还可以设定d[i][0]=i (即word2为空时,word1转换成word2的步骤,一直delete)
而状态转换函数可以由一下规则设定:
(1) 当word1[i-1] = word2[j-1]时,dp[i][j] = dp[i-1][j-1]
(2) 当word1[i-1] != word2[j-1]时,存在三种情况:
A. replace dp[i][j] = dp[i-1][j-1]
B. delete dp[i][j] = dp[i-1][j] + 1
C. insert dp[i][j] = dp[i][j-1] + 1
取这三个值最小的值作为dp[i][j]。代码
class Solution {
public:
int minDistance(string word1, string word2) {
unsigned int n = word1.length();
unsigned int m = word2.length();
vector<int> dp(n+1,0);
for (int i = 0; i <= n; ++i)
dp[i] = i;
for (int i = 1; i <= m; ++i) {
int pre = dp[0];
dp[0] = i;
for (int j = 1; j <= n; ++j) {
int tmp = dp[j];
if (word2[i-1] == word1[j-1]) {
dp[j] = pre;
} else {
dp[j] = min(pre+1,min(dp[j]+1,dp[j-1]+1));
}
pre = tmp;
}
}
return dp[n];
}
};
注:这里可以对空间进行压缩,将空间复杂度O(mn)压缩成O(n)