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]; } };