码迷,mamicode.com
首页 > 其他好文 > 详细

51nod 1183 编辑距离

时间:2017-07-21 20:41:20      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:插入   动态   char   space   字符替换   开始   bsp   示例   names   

  编辑距离,又称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



动态规划题目,设dp[i][j]为a前i个字符和b前j个字符的编辑距离,
那么当a[i] == b[j](字符串从0开始)时,dp[i+1][j+1] = min(dp[i][j],min(dp[i][j+1]+1,dp[i+1][j]+1));
当不等于时,dp[i+1][j+1] = min(dp[i][j]+1,min(dp[i+1][j]+1,dp[i][j+1]+1));
要注意的是dp[0][j] 和 dp[i][0]这两种情况。
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 using namespace std;
 5 char str1[1010], str2[1010];
 6 int dp[1010][1010];
 7 int main(){
 8     scanf("%s%s",str1,str2);
 9     int len1 = strlen(str1), len2 = strlen(str2);
10     for(int i = 0; i <= len2; i ++) dp[i][0] = dp[0][i] = i;
11     for(int i = 0; i < len1; i ++){
12         for(int j = 0; j < len2; j ++){
13             if(str1[i] == str2[j]) dp[i+1][j+1] = min(dp[i][j],min(dp[i][j+1]+1,dp[i+1][j]+1));
14             else dp[i+1][j+1] = min(dp[i][j]+1,min(dp[i+1][j]+1,dp[i][j+1]+1));
15         }
16     }
17     printf("%d\n",dp[len1][len2]);
18     return 0;
19 }

 

 

51nod 1183 编辑距离

标签:插入   动态   char   space   字符替换   开始   bsp   示例   names   

原文地址:http://www.cnblogs.com/xingkongyihao/p/7219421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!