1183 编辑距离

时光怂恿深爱的人放手 提交于 2020-02-08 23:11:18

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 ; 
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!