583. 两个字符串的删除操作
链接:代码随想录
本题和动态规划:115.不同的子序列 相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。
自己的思路和错误的地方。
看了代码随想录之后,自己写出来的。理解程度80%。具体不太彻底懂的点在递推公式那里。
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,0)); //初始化第一行 for(int j=0;j<m+1;j++) { dp[0][j]=j; } //初始化第一列 for(int i=0;i<n+1;i++) { dp[i][0]=i; } for(int i=1;i<n+1;i++) { for(int j=1;j<m+1;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],dp[i][j-1])+1; } } } return dp[n][m]; } };
72. 编辑距离
最终我们迎来了编辑距离这道题目,之前安排题目都是为了 编辑距离做铺垫。
链接:代码随想录
![]()
竟然自己想的还不错。代码一次过。
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,0)); //初始化第一行 for(int j=0;j<m+1;j++) { dp[0][j]=j; } //初始化第一列 for(int i=0;i<n+1;i++) { dp[i][0]=i; } for(int i=1;i<n+1;i++) { for(int j=1;j<m+1;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,min(dp[i-1][j-1]+1,dp[i][j-1]+1)); } } } return dp[n][m]; } };
编程问题:两个字符串的删除操作与编辑距离,
文章讨论了两个字符串之间的删除操作问题,与动态规划中的不同子序列问题有相似之处。作者提到,虽然复杂,但思路类似。文章提供了代码实现,包括一个有误的递推公式和一个正确的编辑距离算法。编辑距离问题通过初始化和递推公式解决了字符匹配和不匹配的情况。





竟然自己想的还不错。代码一次过。
589

被折叠的 条评论
为什么被折叠?



