算法第三章上机实验报告

实践题目
 
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;
} 
View Code

算法时间及空间复杂度分析:

  时间复杂度:填表法,时间复杂度是O(m*n)

     空间复杂度:没有额外开辟空间,所以空间复杂度是O(1)

心得体会:动态规划最重要的还是要写出递归方程,填表法需要反复借用状态转移方程来求未知量

原文地址:https://www.cnblogs.com/gwpsf/p/11715914.html