给定两个字符串S和T,对于T我们允许三种操作:


(1) 在任意位置添加任意字符
(2) 删除存在的任意字符
(3) 修改任意字符 

问最少操作多少次可以把字符串T变成S? 
输入

第1行:字符串a(a的长度 <= 1000)。
第2行:字符串b(b的长度 <= 1000)。
输出
 
输出a和b的编辑距离
 
输入示例

kitten
sitting

输出示例

3

思路:dp[i][j] = min(dp[i - 1][j - 1] + same[i][j], dp[i - 1][j] + 1, dp[i][j - 1] + 1)
   dp[i][j] 表示s1前i个和s2前j个的编辑距离 same[i][j] 表示s1[i] == s2[j] 相等为0,不等为1
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<limits.h>
 4 #include<stdlib.h>
 5 #include<string.h>
 6 #include<complex>
 7 #include<cstring>
 8 #include<iomanip>
 9 #include<stdio.h>
10 #include<bitset>
11 #include<cctype>
12 #include<math.h>
13 #include<string>
14 #include<time.h>
15 #include<vector>
16 #include<cmath>
17 #include<queue>
18 #include<stack>
19 #include<list>
20 #include<map>
21 #include<set>
22 
23 #define LL long long
24 
25 using namespace std;
26 const LL mod = 1e9 + 7;
27 const double PI = acos(-1.0);
28 const double E = exp(1.0);
29 const int M = 1010;
30 
31 int dp[M][M];
32 string s1;
33 string s2;
34 
35 int main()
36 {
37     while( cin >> s1 >> s2 ){
38         int len1 = s1.size();
39         int len2 = s2.size();
40         memset(dp, 0, sizeof(dp));
41         s1 = "#" + s1;
42         s2 = "#" + s2;
43         for(int i = 0; i <= len1; ++i)
44             dp[i][0] = i;
45         for(int i = 0; i <= len2; ++i)
46             dp[0][i] = i;
47         for(int i = 1; i <= len1; ++i){
48             for(int j = 1; j <= len2; ++j){
49                 if(s1[i] == s2[j])
50                     dp[i][j] = dp[i - 1][j - 1];
51                 else
52                     dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
53             }
54         }
55         cout << dp[len1][len2] << endl;
56     }
57     return 0;
58 }

 

posted on 2015-08-05 09:06  Unico  阅读(393)  评论(0)    收藏  举报