• 第三章上机实践报告


    一、实践题目

    7-3 编辑距离问题

    二、问题描述

    输入两个字符串,使用最少的操作即最短编辑距离,将一个字符串变成另一个字符串,输出最短编辑距离


    三、算法描述

    1.定义:定义并输入两个字符串s,t,再定义一个二维数组dp[i][j]来记录s中第1到第i个字符,t中第1到第j个字符的最短编辑距离

    2.初始化:dp[0][j]=j,dp[i][0]=i(当有一个字符串没有字符时,另一个字符串最少的操作是将其字符全部删掉)

    3.填表:考虑s[i]和t[j]的关系:

          ①s[i]==t[j]时:dp[i][j]=dp[i-1][j-1](末尾有一个相同的字符时,不用操作,从各自的前一个字符开始计算)

          ②s[i]!=t[j]时:有三种操作,任意删除两个字符串其中一个的字符,即dp[i][j]=dp[i-1][j]+1 or dp[i][j]=dp[i][j-1]+1,修改其中一个的字符,dp[i][j]=dp[i-1][j-1]+1

                 然后三者取最小的,即dp[i][j]=min(dp[i-1][j-1], min(dp[i-1][j],dp[i][j-1])+1

    代码如下:

    #include <iostream>
    #include <string.h>
    using namespace std;
    char s[2000];
    char t[2000];
    int dp[2000][2000];
    int main(){
        cin>>(s+1)>>(t+1);
        int len1=strlen(s+1);
        int len2=strlen(t+1);
        
        for(int i=1;i<=len1;i++){
            dp[i][0]=i;
        }
        for(int j=1;j<=len2;j++){
            dp[0][j]=j;
        }
        for(int i=1;i<=len1;i++){
            for(int j=1;j<=len2;j++){
                if(s[i]==t[j])
                    dp[i][j]=dp[i-1][j-1];
                else
                    dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
            }
        }
        cout<<dp[len1][len2];
        
        return 0;
        
    } 
    View Code

    四、算法时间及空间复杂度分析(要有分析过程)

      时间复杂度为o(m*n):用了填表法,填充了一个m*n的表格。

      空间复杂度为o(1):没借助辅助空间。


    五、心得体会(对本次实践收获及疑惑进行总结)

      做动态规划的题时要先写出递归方程,然后再解决边界问题,然后基本就能解决问题。

  • 相关阅读:
    遇到项目上面有叉,但是找不到错误的原因
    遇到build的问题
    遇到scan configurtation CDT builder等的错误
    遇到attemp to invoke virtual method
    遇到looper之类关于消息循环的
    Linux与Windows信息交互快捷方法
    并行查询
    PostgreSQL 事务管理的MVCC
    Linux安装memcached
    Linux 安装 Redis
  • 原文地址:https://www.cnblogs.com/hxyawsl/p/11713549.html
Copyright © 2020-2023  润新知