题解 | #编辑距离(一)#
编辑距离(一)
https://www.nowcoder.com/practice/6a1483b5be1547b1acd7940f867be0da
#include <vector> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str1 string字符串 * @param str2 string字符串 * @return int整型 */ // 记忆化搜索 // int editDistance(string str1, string str2) { // // write code here // int n=str1.size(),m=str2.size(); // vector<vector<int>> memo(n+1,vector<int>(m+1,-1)); // function<int(int,int)> dfs =[&](int i,int j) ->int { // if(i<0) return j+1;//由于一个字符串为空,所以返回你要把这j+1个字符都删掉 // if(j<0) return i+1;//由于一个字符串为空,所以返回你要把这i+1个字符都删掉 // int &res=memo[i][j]; // if(res!=-1) return res; // if(str1[i]==str2[j]) return res=dfs(i-1,j-1); // return res=min(min(dfs(i-1,j),dfs(i,j-1)),dfs(i-1,j-1))+1; // }; // return dfs(n-1,m-1); // } // 记忆化搜索改成动态规划 // int editDistance(string str1, string str2) { // // write code here // int n = str1.size(), m = str2.size(); // vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0)); // for (int j = 0; j <= m; j++) dp[0][j] = j; // for (int i = 0; i <= n; i++) dp[i][0] = i; // for (int i = 0; i < n; i++) { // for (int j = 0; j < m; j++) { // if (str1[i] == str2[j]) dp[i + 1][j + 1] = dp[i][j]; // else dp[i + 1][j + 1] = min(min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1; // } // } // return dp[n][m]; // } // 二维dp 优化空间 // int editDistance(string str1, string str2) { // // write code here // int n = str1.size(), m = str2.size(); // vector<vector<int>> dp(2, vector<int>(m+1, 0)); // for (int j = 0; j <= m; j++) dp[0][j] = j; // for (int i = 0; i < n; i++) { // dp[(i + 1) % 2][0] = i + 1; // for (int j = 0; j < m; j++) { // if (str1[i] == str2[j]) dp[(i + 1)%2][j + 1] = dp[i%2][j]; // else dp[(i + 1)%2][j + 1] = min(min(dp[i%2][j + 1], dp[(i + 1)%2][j]), dp[i%2][j]) + 1; // } // } // return dp[n%2][m]; // } // 一维dp 优化空间 int editDistance(string str1, string str2) { // write code here int n = str1.size(), m = str2.size(); vector<int> dp(m+1, 0); for (int j = 0; j <= m; j++) dp[j] = j; for (int i = 0; i < n; i++) { int pre=dp[0]; dp[0] = i + 1; for (int j = 0; j < m; j++) { int tmp = dp[j+1]; if (str1[i] == str2[j]) dp[j + 1] = pre; else dp[j + 1] = min(min(dp[j + 1], dp[j]), pre) + 1; pre = tmp; } } return dp[m]; } }; // dfs(i,j) // ① str1[i]==str2[j] return dfs(i-1,j-1); // ② str1[i]!=str2[j] // dfs(i-1,j)+1 // dfs(i,j-1)+1 // dfs(i-1,j-1)+1 // return min(min(dfs(i-1,j),dfs(i,j-1)),dfs(i-1,j-1))+1; // dfs(i,j) = min(min(dfs(i-1,j),dfs(i,j-1)),dfs(i-1,j-1))+1; // dfs(i+1,j+1) = min(min(dfs(i,j+1),dfs(i+1,j)),dfs(i,j))+1;