原题链接:72. 编辑距离
solution:
动态规划题:
动态规划就是实现对暴力搜索的优化,达到用一个数组描述一个集合的存在。
现在有两个字符串word1和word2.
状态表示:dp[i][j]表示将word1中的前i个字母变成word2中前j的字母的方法的集合
属性:求方法数量的最小值min
状态计算:以word1中的第i个字母为例子进行分析.
①添加操作:在word1中第i个字母后添加一个字母相同,表示在没有添加之前word1中的前i个字母和word2中的前j - 1个字母相同。
转移方程:dp[i][j] = dp[i][j - 1] + 1
②删除操作:删除该字母变的相同,表示在删除之前word1中的前i - 1个字母和word2中的前j个字母相同。
转移方程:dp[i][j] = dp[i - 1][j] + 1
③替换操作:将word1中的第i个字母替换成word2中的第j个字母,表示在替换之前word1中的前i-1个字母已经和word2中的前j - 1个字母相同。
转移方程:dp[i][j] = dp[i - 1][j - 1] + 1
④无操作:说明word1中的第i个字母和word2中的第j个字母相同
转移方程:dp[i][j] = dp[i - 1][j - 1]
因此最终答案取上述方案最小值
class Solution {
public:
int minDistance(string word1, string word2) {
int n = word1.size();
int m = word2.size();
vector<vector<int>> dp(n + 1, vector<int> (m + 1));
for(int i = 0;i <= n;i++) dp[i][0] = i;
for(int j = 0;j <= m;j++) dp[0][j] = j;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++) {
dp[i][j] = min(dp[i - 1][j],dp[i][j - 1]) + 1;
if(word1[i - 1] != word2[j - 1])
dp[i][j] = min(dp[i][j],dp[i - 1][j - 1] + 1);
else dp[i][j] = min(dp[i][j],dp[i - 1][j - 1]);
}
return dp[n][m];
}
};
初始化边界条件dp[i][0]只能进行删除操作 ,dp[0][j]只能进行添加操作。