标签:int 距离 down 编辑 word1 word2 LeetCode dp left
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
对于最优问题计算,考虑用动态规划,这里dp[i][j]设为
为word1前i个字符和word2前j个字符的最少操作数
随着往后遍历,需要考虑的字符串长度增加,分别需要考虑由增添、删除、修改三种方式转移过来的状态,取最小值
增,dp[i][j] = dp[i][j - 1] + 1
删,dp[i][j] = dp[i - 1][j] + 1
改,dp[i][j] = dp[i - 1][j - 1] + 1
class Solution {
public:
int minDistance(string word1, string word2) {
//最优问题使用动态规划,设dp[i][j]为word1前i个字符和word2前j个字符的最少操作数
//接着考虑状态转移方程和边界条件
//显然dp[0][j]=j,dp[i][0]=i
//dp[i][j]
int n = word1.size();
int m = word2.size();
// 有一个字符串为空串
if (n * m == 0) return n + m;
// DP 数组
vector<vector<int>> D(n + 1, vector<int>(m + 1));
// 边界状态初始化
for (int i = 0; i < n + 1; i++)
D[i][0] = i;
for (int j = 0; j < m + 1; j++)
D[0][j] = j;
// 计算所有 DP 值
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < m + 1; j++) {
int left = D[i - 1][j] + 1;
int down = D[i][j - 1] + 1;//
int left_down = D[i - 1][j - 1];
if (word1[i - 1] != word2[j - 1]) left_down += 1;//不相等需要替换
D[i][j] = min(left, min(down, left_down));
}
}
return D[n][m];
}
};
标签:int,距离,down,编辑,word1,word2,LeetCode,dp,left 来源: https://www.cnblogs.com/929code/p/16314740.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。