题目链接
计算字符串1变换为字符串2需要的最少步数
输入: word1 = "horse", word2 = "ros"
输出: 3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
首先我们要确定这是个动态规划的题目
dp数组:
表示当字符串 word1 的长度为 i,字符串 word2 的长度为 j 时,将 word1 转化为 word2 所使用的最少操作次数为 dp[i] [j]。
初始化:
如果有一个字符串的长度为0,所以另外一个字符串长度每长1就要+1
然后会过来解析题目
如果 word1[i] 与 word2 [j] 相等,这个时候不需要进行任何操作,有 dp[i] [j] = dp[i-1] [j-1]。
如果word1[i] 与 word2 [j] 不相等
1.替换成相等的
`dp[i] [j] = dp[i-1] [j-1] + 1;`
2.在word1[i]后插入一个然后让world[i]与world[j]相等
`dp[i] [j] = dp[i] [j-1] + 1;`
3.删除word1[i]
`dp[i] [j] = dp[i-1] [j] + 1;`
因为这里要求最小的,所以我们要选择最小步数的一个
则有
dp[i][j] =min(dp[i - 1][j - 1], dp[i][j - 1], dp[i - 1][j]) + 1;
又因为在c++中min函数是两个之间的比较,所以我们要写成这种方式
dp[i][j] = min(min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
int minDistance(string word1, string word2) {
int size1 = word1.size();
int size2 = word2.size();
int dp[1010][1010] = { 0 };
for (int i = 1; i <= size2; i++) {
dp[0][i] = dp[0][i - 1] + 1;
}
for (int i = 1; i <= size1; i++) {
dp[i][0] = dp[i - 1][0] + 1;
}
for (int i = 1; i <=size1; i++) {
for (int j = 1; j <= size2; j++) {
if (word1[i - 1] == word2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
}
else {
dp[i][j] = min(min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
}
}
}
return dp[size1][size2];
}