源串到目的串:只能删除、增加、替换
动态规划:dp[i][j] s[0....i] ->t[0...j]的最小编辑距离
字符串对其:状态方程:
dp[i][j] = min{dp[i-1][j]+1,dp[i][j-1]+1,dp[i][j]=dp[i-1][j-1]+(s[i]==t[j]?0:1)}
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int dis(char *s, char *t)
{
int slen = strlen(s);
int tlen = strlen(t);
int **dp;
dp = new int* [slen + 1];
for (int i = 0; i < slen + 1; ++i)
{
dp[i] = new int[tlen + 1];
}
//dp[0][0] = 0;
for (int i=0;i<=slen;++i)
{
dp[i][0] = i;
}
for (int j=0;j<=tlen;++j)
{
dp[0][j] = j;
}
for (int i = 1; i <= slen; ++i)
{
for (int j = 1; j <= tlen; ++j)
{
int dp1 = dp[i - 1][j - 1] + (s[i] == t[j] ? 0 : 1);
dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1]);
dp[i][j] = min(dp1, dp[i][j]);
}
}
int res = dp[slen][tlen];
for (int i=0;i<slen+1;++i)
{
delete[] dp[i];
}
delete[] dp;
return res;
}
int main()
{
char a[10] = "ALGORITHM";
char t[11] = "ALTRUISTIC";
int n = dis(a, t);
cout << n << endl;
}