给定一个原串和目标串,能对源串进行如下操作:
1.在给定位置插入一个字符
2.替换任意字符
3.删除任意字符 要求完成一下函数,返回最少的操作数,使得源串进行这些操作后等于目标串。源串和目标串长度都小于2000。
public static int minEdit_distance(String source, String target) { int cost=0; final int n = target.length(); final int m = source.length(); if (m == 0) return n; if (n == 0) return m; int[][] distance_matrix = new int[m + 1][n + 1]; distance_matrix[0][0] = 0; for (int i = 0; i <= n; i++) { distance_matrix[0][i] = i; } for (int j = 0; j <= m; j++) { distance_matrix[j][0] = j; } for (int i = 1; i <= m; i++) { char ci = source.charAt(i - 1); for (int j = 1; j <= n; j++) { char cj = target.charAt(j - 1); if (ci == cj) { cost = 0; } else { cost = 1; } distance_matrix[i][j] = Math.min(distance_matrix[i - 1][j - 1] + cost, Math.min(distance_matrix[i - 1][j] + 1, distance_matrix[i][j - 1] + 1)); } } return distance_matrix[m][n]; }
#include <string> using namespace std; classSolution { public: /** * 返回从源字符串到目标字符串的最小操作数 * source: 源字符串 * target:目标字符串 * 返回:最小操作数 */ intminOperationCount(string source, string target) { intm=source.size(); intn=target.size(); vector<vector<int>> dp(m+1, vector<int>(n+1, 0)); dp[0][0] = 0; for(inti=1;i<=m;i++){ dp[i][0] = dp[i-1][0] + 1; } for(intj=1;j<=n;j++){ dp[0][j] = dp[0][j-1] + 1; } for(inti=1;i<=m;i++){ for(intj=1;j<=n;j++){ if(source[i-1] == target[j-1]){ dp[i][j] = dp[i-1][j-1]; } else{ dp[i][j] = min(dp[i-1][j-1], dp[i-1][j]); dp[i][j] = min(dp[i][j], dp[i][j-1]) + 1; } } } returndp[m][n]; } };
#include <string> using namespace std; class Solution { public: /** * 返回从源字符串到目标字符串的最小操作数 * source: 源字符串 * target:目标字符串 * 返回:最小操作数 */ int minOperationCount(string source, string target) { string &a = source, &b = target; vector<vector<int> > dp = vector<vector<int> > (a.size()+1, vector<int>(b.size()+1, 0)); for(int i = 1; i <= a.size(); ++i) dp[i][0] = i; for(int i = 1; i <= b.size(); ++i) dp[0][i] = i; for(int i = 1; i <= a.size(); ++i) for(int j = 1; j <= b.size(); ++j){ if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1]; else dp[i][j] = min(dp[i][j-1], min(dp[i-1][j-1], dp[i-1][j])) + 1; } return dp[a.size()][b.size()]; } };
public int min(int a, int b, int c){ if(a < b){ return a < c ? a : c; }else{ return b < c ? b : c; } } public int getMinDis(String s1, String s2){ int n1 = s1.length(); int n2 = s2.length(); int f[][] = new int [n1+1][n2+1]; for(int i = 1; i <= n1; i ++){ f[i][0] = i; } for(int i = 1; i <= n2; i ++){ f[0][i] = i; } for(int i = 1; i <= n1; i ++){ for(int j = 1; j <= n2; j ++){ if(s1.charAt(i-1) == s2.charAt(j-1)){ f[i][j] = f[i-1][j-1]; }else{ f[i][j] = min(f[i-1][j-1], f[i][j-1], f[i-1][j]) + 1; } } } return f[n1][n2]; }