给定一个原串和目标串,能对源串进行如下操作:
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];
}