********编辑距离:https://leetcode.cn/problems/edit-distance/description/
定义:dp[i][j] 为 breed1 的前 i 个字符转成 breed2 的前 j 个字符所需的距离
初始化:当 i 为 0 时,易知需要 j 的操作次数,即 dp[0][j] = j;同理,dp[i][0] = i
递推公式:从 str1 转成 str2 可以有以下三种方法:
1、在 str1 末尾插入一个字符,此时 str1[0...i]==str2[0...j-1],那么对于 str2 的第 j 个字符,需要在 str1 的末尾插入该字符,对应 dp[i][j] = dp[i][j-1] + 1
2、在 str2 末尾插入一个字符,此时说明 str1[0...i-1]==str2[0...j],那么对于 str1 的第 i 个字符,需要在 str2 的末尾插入该字符,对应 dp[i][j] = dp[i-1][j] + 1
3、修改 str1 的末尾字符,对应 dp[i][j] = dp[i-1][j-1] + 1
特别地,如果 str1 的末尾字符恰好与 str2 的末尾字符相同,那么可以不再需要操作,对应 dp[i][j] = dp[i-1][j-1]
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param breed1 string字符串 * @param breed2 string字符串 * @return int整型 */ int minOperations(string breed1, string breed2) { int l1 = breed1.size(), l2 = breed2.size(); vector<vector<int>> dp(l1 + 1, vector<int>(l2 + 1, 0)); for (int i = 0; i <= l1; i++) { dp[i][0] = i; } for (int j = 0; j <= l2; j++) { dp[0][j] = j; } for (int i = 1; i <= l1; i++) { for (int j = 1; j <= l2; j++) { dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1; if (breed1[i - 1] == breed2[j - 1]) { dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]); } } } return dp[l1][l2]; } };
时间复杂度:O(mn),m和n分别为两个字符串的长度
空间复杂度:O(mn),m和n分别为两个字符串的长度