当前位置:首页 > 编程笔记 > 正文
已解决

day-56 代码随想录算法训练营(19)动态规划 part 16

来自网友在路上 137837提问 提问时间:2023-09-23 03:01:12阅读次数: 37

最佳答案 问答题库378位专家为你答疑解惑

538.两个字符串的删除操作

思路一:
  • 1.dp存储:以word1[i-1]结尾,word2[j-1]结尾,最少进行dp[i][j]次操作
  • 2.动态转移方程: if(word1[i-1]==word2[i-1]) dp[i][j]=dp[i-1][j-1];
  •                 else dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1)
  • 3.初始化:dp[i][0]=i   dp[0][j]=j
  • 4.遍历顺序:1~尾巴
class Solution {
public:int minDistance(string word1, string word2) {int n=word1.size(),m=word2.size();vector<vector<int>>dp(n+1,vector<int>(m+1,0));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++){if(word1[i-1]==word2[j-1]) dp[i][j]=dp[i-1][j-1];//不需要操作else dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1);//两个字符串各自的操作取最小}}return dp[n][m];}
};

72.编辑距离

思路:
  • 1.dp存储:以word1[i]结尾,word2[j]结尾,使两个字符串相同的最小操作次数
  • 2.动态转移方程: if(word1[i-1]==word2[j-1]) dp[i][j]=dp[i-1][j-1];
  •                 else dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1)
  • 3.初始化:dp[i][0]=i   dp[0][j]=j
  • 4.遍历顺序:1~n 1~m
class Solution {
public:int minDistance(string word1, string word2) {int n=word1.size(),m=word2.size();vector<vector<int>>dp(n+1,vector<int>(m+1,0));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++){//添加和删除都是一样的,两边各添加和删除;改变就是上一次的值+1if(word1[i-1]==word2[j-1]) dp[i][j]=dp[i-1][j-1];else dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1));}}return dp[n][m];}
};

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"day-56 代码随想录算法训练营(19)动态规划 part 16":http://eshow365.cn/6-11841-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!