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位置的编辑距离。
转移方程 : 如果当前
, 则 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 ;
}
来源:CSDN
作者:不想悲伤到天明
链接:https://blog.csdn.net/qq_41661809/article/details/104228571