实践题目
7-3 编辑距离问题 (30 分)
设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。
输入格式:
第一行是字符串A,文件的第二行是字符串B。
提示:字符串长度不超过2000个字符。
输出格式:
输出编辑距离d(A,B)
问题描述:求最两个字符串的最短编辑距离。
算法描述:
如果a[i]==b[j]那么dp[i][j] 的答案就是 dp[i-1][j-1]
如果a[i]!=b[j] 那么dp[i][j] 的答案将会是,
删除a[i]: 1+dp[i-1][j], 删除b[j]: 1+dp[i][j] , 修改a[i] 使 a[i]==b[j]: 1+dp[i-1][j-1]
这三个操作中答案最小的那个
#include<iostream> #include<cstring> using namespace std; char a[2100],b[2100]; int dp[2100][2100]; int main() { cin >> a + 1 >> b + 1; int alen = strlen (a + 1); int blen = strlen (b + 1); for(int i = 1; i <= alen; i ++) dp[i][0] = i; for(int i = 1; i <= blen; i ++) dp[0][i] = i; for(int i = 1; i <= alen; i ++) { for(int j = 1; j <= blen; j ++) { if(a[i] == b[j]) dp[i][j] = dp[i - 1][j - 1]; else dp[i][j] = min(dp[i - 1][j],min(dp[i][j - 1],dp[i - 1][j - 1])) + 1; } } cout << dp[alen][blen]; return 0; }
算法时间及空间复杂度分析:
时间复杂度:填表法,时间复杂度是O(m*n)
空间复杂度:没有额外开辟空间,所以空间复杂度是O(1)
心得体会:动态规划最重要的还是要写出递归方程,填表法需要反复借用状态转移方程来求未知量