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
" , len2) ; 
            continue ; 
        }
        if(len2 == 0 ){
            printf("%d
" , 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 " , vis[len1][len2]) ; } return 0 ; }
原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7578355.html