最小编辑距离
原创
©著作权归作者所有:来自51CTO博客作者stormjing的原创作品,请联系作者获取转载授权,否则将追究法律责任
51nod1183
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
sitten (k->s)
sittin (e->i)
sitting (->g)
所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
给出两个字符串a,b,求a和b的编辑距离。
跟最长公共子序列有点像,状态转移方程
================== 增删字符
================== 增删字符
======= 相同不增加操作,不相同改为相同增加操作1.
字符数组留第一个位置空,容易写dp转移方程
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define d(x) cout << (x) << endl
#pragma GCC diagnostic error "-std=c++11"
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 1e3 + 10;
char a[N]; //a b 数组下标从1开始存字符串
char b[N];
int dp[N][N]; //dp[i][j]代表 a前i字符 与 b 前j字符 最小编辑距离
int editlen()
{
int len1 = strlen(a + 1);
int len2 = strlen(b + 1);
for(int i = 1; i <= len1; i++){
for (int j = 1; j <= len2; j++){
dp[i][j] = INF; //初始化无限大
}
}
for (int i = 1; i <= len2; i++){
dp[i][0] = i; //将i个字符全部删除
}
for (int j = 1; j <= len2; j++){
dp[0][j] = j; //将j个字符全部删除
}
int tag;
for (int i = 1; i <= len1; i++){
for (int j = 1; j <= len2; j++){
tag = (a[i] == b[j] ? 0 : 1);
dp[i][j] = min(dp[i][j - 1] + 1, min(dp[i - 1][j] + 1, dp[i - 1][j - 1] + tag));
}
}
return dp[len1][len2];
}
int main()
{
scanf("%s", a + 1);
scanf("%s", b + 1);
printf("%d\n", editlen());
return 0;
}