给定两个字符串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 }
浙公网安备 33010602011771号