1183 编辑距离(51NOD)(dp)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183
1183 编辑距离(51NOD)(dp)
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
sitten (k->s)
sittin (e->i)
sitting (->g)
所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
给出两个字符串a,b,求a和b的编辑距离。
Input
第1行:字符串a(a的长度 <= 1000)。
第2行:字符串b(b的长度 <= 1000)。
Output
输出a和b的编辑距离
Input示例
kitten
sitting
Output示例
3
思路:vis[i][j] 表示 str1 串前 i 个字符 和 str2 串 前 j 个字符 匹配花费的代价(操作次数)
则 vis[i][j] = min(vis[i-1][j-1] + temp, min(vis[i-1][j] +1 , vis[i][j-1] +1)) ; // str1[i] == str2[j] 时 temp=0,否则temp = 1 ;
#include <cstdio> #include <cstring> #include <algorithm> using namespace std ; #define maxn 1000+50 char str1[maxn] ; char str2[maxn] ; int temp ; int vis[maxn][maxn] ; int main(){ while(~scanf("%s%s" , str1 , str2)){ int len1 = strlen(str1) ; int len2 = strlen(str2) ; if(len1 == 0 ){ printf("%d\n" , len2) ; continue ; } if(len2 == 0 ){ printf("%d\n" , len1) ; continue ; }
// vis[i][j] 表示 str1 串前 i 个字符 和 str2 串 前 j 个字符 匹配花费的代价(操作次数) for(int i = 0 ; i <= len1 ; i ++ ) { vis[i][0] = i ; } for(int i = 0 ; i <= len2 ; i++ ) { vis[0][i] = i ; } for(int i=1 ; i<=len1 ; i++){ for(int j=1 ; j<=len2 ; j++){ if(str1[i-1] == str2[j-1]){ temp = 0 ; } else { temp = 1 ; } vis[i][j] = min(vis[i-1][j-1] + temp, min(vis[i-1][j] +1 , vis[i][j-1] +1)) ; } } printf("%d\n" , vis[len1][len2]) ; } return 0 ; }