1183 编辑距离

编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将kitten一字转成sitting:

sitten (k->s)

sittin (e->i)

sitting (->g)

所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。

给出两个字符串a,b,求a和b的编辑距离。

 收起

输入


第1行:字符串a(a的长度 <= 1000)。 第2行:字符串b(b的长度 <= 1000)。


输出


输出a和b的编辑距离


输入样例


kitten sitting


输出样例


3


思路 :  一个字符串 a 转移成另一个字符串 b  需要进行的最小次数 , 一共三中操作 , 修改,删除,添加 。删除和添加都改变了字符串的长度。转移函数 dp[i][j]  表示的是a串的i位置和b串的j位置的编辑距离。

转移方程 :  如果当前  

1183 编辑距离_字符串

   , 则 dp[i][j] = dp[i-1][j-1]  ,即什么也不干。否则, dp[i ][j] = min(修改,删除,插入) ;

即 , dp [i][j] = min (dp[i-1][j-1+1 , min(dp[i-1][j] +1 , dp[i][j-1]+1)  ;

插入 : dp[i-1][j]  +1 

删除 : dp[i][j-1]  + 1 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
using namespace std;
typedef long long LL ;
const int MAX = 1005 ;
const int inf = 0x3f3f3f3f ;
char a[MAX] ;
char b[MAX] ;
int dp[MAX][MAX] ;
// dp[i][j] 表示 前i个字符串和 前b个字符串的编辑距离
//kitten
//sitting
int main() {
scanf("%s%s",a,b);
int lena = strlen(a) ;
int lenb = strlen(b) ;
memset(dp,inf,sizeof(dp));
dp[0][0] = 0 ;
for(int i= 1 ;i<=lena ;i++ ) {
dp[i][0] = i ;
}
for(int j = 1 ; j<=lenb ; j++ ) {
dp[0][j] = j ;
}

for(int i = 1 ; i<=lena ; i++ ) {
for(int j = 1 ;j<=lenb ;j++ ) {
if(a[i-1] != b[j-1]) {
// 插入删除转移
int t = min(dp[i-1][j]+1,dp[i][j-1]+1) ;
// 修改转移
dp[i][j] = min(dp[i-1][j-1] + 1, t ) ;
}
else {
dp[i][j] = dp[i-1][j-1] ;
}
}
}
cout<<dp[lena][lenb] <<endl ;
return 0 ;
}