方法:动态规划
1、创建数组dp来存储,str1[i]到str[j]所需的最少操作数,可以得到如下的状态转移方程:
如果str1[i - 1]和str2[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1];
如果str1[i - 1]和str2[j - 1]不相等时,可能进行三种操作,取三种操作的最小值:
替换:dp[i - 1][j -1] + 1
删除:dp[i - 1][j] + 1,如果要满足删除可以从str1到str2,那么str1的前一个元素一定要满足转换到str2。所以是dp[i - 1][j] + 1。
插入:dp[i][j - 1] + 1,如果要满足插入可以从str1到str2,那么str1的当前元素一定要满足转换到str2的前一个元素为止,这样插入一个元素才能实现转换。所以是dp[i - 1][j] + 1。
2、最终的编辑距离就是数组dp的右下角元素。
时间复杂度:o(n*m)
空间复杂度:o(n*m),n、m分别为两个字符串的长度。
class Solution {
public:
int editDistance(string str1, string str2) {
// 特殊情况处理
if (str1.length() == 0)
return str2.length();
if (str2.length() == 0)
return str1.length();
vector<vector<int> > dp(str1.length() + 1, vector<int> (str2.length() + 1, 0));
// 初始化边界
for (int i = 1; i <= str1.length(); i++)
dp[i][0] = dp[i - 1][0] + 1;
for (int i = 1; i <= str2.length(); i++)
dp[0][i] = dp[0][i - 1] + 1;
for (int i = 1; i <= str1.length(); i++) {
for (int j = 1; j <= str2.length(); j++) {
// 相等和不相等两种情况
if (str1[i - 1] == str2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
}
}
}
return dp[str1.length()][str2.length()];
}
};

京公网安备 11010502036488号