LeetCode72. Edit Distance 动态规划 C++实现
题目链接
题目大意
给定两个字符串word1
和word2
,求最短编辑距离,即通过增删改操作能够使得两个字符串变成一个字符串的最少步骤的步数
算法思路
根据题意,基于动态规划的思想,dp[i][j]
为子串word1[0...i]
与子串word2[0...j]
的编辑距离,初始化,第一行,dp[0][i] = i;
,第一列,dp[i][0] = i
,因为,对于第一行,此时的word1
的子串为空串,和word2
的子串的距离为word1
增加字符的个数,而对于第一列,此时的word2
为空串,则word1
和word2
的距离即为word1
删除的字符个数,动态转移方程为dp[i][j] = (word1[i - 1] == word2[j - 1] ? dp[i - 1][j - 1] : 1 + min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])));
,即考虑两种情况
- 若
word1
的第i
个字符和word2
第j
个字符相等,则无需操作,dp[i][j] = dp[i - 1][j - 1];
- 若
word1
的第i
个字符和word2
第j
个字符不相等,可以有三种选择,分别为删除一个word1
字符、增加一个word1
字符和替换一个word1
字符,即基于已完成操作步骤数dp[i - 1][j]
删除word1
一个字符或增加word2
一个字符基于已完成操作步骤数dp[i][j - 1]
增加word1
一个字符或删除word2
一个字符和基于已完成操作步骤数dp[i - 1][j - 1]
替换word1
或word2
一个字符,增删改的步骤数都为1
,动态转移方程选取最小的一个加上步骤数1
最后返回dp[word1.length()][word2.length()]
即可
AC代码
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int> > dp(word1.length() + 1, vector<int> (word2.length() + 1, 0));
for (int i = 0; i < dp.size(); i++) {
dp[i][0] = i;
}
for (int i = 0; i < dp[0].size(); i++) {
dp[0][i] = i;
}
for (int i = 1; i < dp.size(); i++) {
for (int j = 1; j < dp[i].size(); j++) {
dp[i][j] = (word1[i - 1] == word2[j - 1] ? dp[i - 1][j - 1] : 1 + min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])));
}
}
return dp[word1.length()][word2.length()];
}
};
样例输入1
horse
ros
样例输出1
3
样例输入2
intention
execution
样例输出2
5
鸣谢
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!