一、实践题目

设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括:
()删除一个字符;
()插入一个字符;
()将一个字符改为另一个字符。
将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。
对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。 输入格式:
第一行是字符串A,文件的第二行是字符串B。 提示:字符串长度不超过2000个字符。 输出格式:
输出编辑距离d(A,B) 输入样例:
在这里给出一组输入。例如: fxpimu
xwrs
输出样例:
在这里给出相应的输出。例如:

二、问题描述

题目大意是:给出两个字符串 a、b,可以通过增删改三个操作将a变成b,需要进行几次操作。

三、算法描述

这道题类似于求最长公共子序列,但是还是更高级一点的。我用了res [2002][2002]来存储结果,res[i][j]表示a的子串(下标从0到i)转化为b的子串(下标从0到j)需要的操作次数,因此本题结果是res[strlen(a)][strlen(b)]。

那么问题就转化为求出res数组。

本题的res数组:

a \ b x w r s
f 1  2 3 4
x 1 2 3 4
p 2 2 3 4
i 3 3 3 4
m 4 4 4 4
u 5 5 5 5

1、初始化:当strlen(a)=0,res[0][j]=j;同理可得res[i][0]=i;

2、当a[i-1]=b[j-1],则res[i][j]=res[i-1][j-1],即等于左上角的元素;

3、当a[i-1]!=b[j-1],有以下三种情况:

(1)若进行删除操作:操作数加1,res[i][j]=res[i-1][j]+1;

(2)若进行增加操作:操作数加1,res[i][j]=res[i][j-1]+1;

(3)若进行替换操作:操作数加1,res[i][j]=res[i-1][j-1]+1;

  res[i][j]等于上面三种情况res[i][j]里的最小值

通过以上分析,我们可以发现填表规则是从上到下从左往右填一个大小为strlen(a)*strlen(b)的表格,两层for循环对res数组操作:匹配时取左上的值;

失配时取 左上+1,左边+1,右边+1 三个数中的最小值,更新res[i]][j];

最后递推到右下角dp[la][lb]为所求答案

代码如下:

 #include<iostream>
#include<string.h>
using namespace std;
char a[], b[];
int res [][];
int temp = ;
int main (){
cin >> a;
cin >> b;
int la = strlen (a);
int lb = strlen (b);
for(int i = ; i <= la; i++) res[i][] = i;
for(int i = ; i <= lb; i++) res[][i] = i; for(int i = ; i <= la; i++){
for(int j = ; j <= lb; j++){
if(a[i-] == b[j-]) temp = ; else temp = ;
int t = min(res[i-][j] + ,res[i][j-] + );
res[i][j] = min(t,res[i-][j-] + temp);
}
} cout << res[la][lb];
return ;
}

四、算法时间及空间复杂度分析

采用dp思想,两层for循环处理res数组,故时间复杂度为O(n^2)

五、心得体会

dp问题最重要的还是要找到问题的最优解子结构,然后建立递推关系,确定好填表的顺序。

多打题,才能提高、加深对算法的理解。

PTA 7-3 编辑距离问题 (30 分)的更多相关文章

  1. PTA 7-1 公路村村通 (30分)

    PTA 7-1 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N ...

  2. PTA 练习 7-24 喊山 (30 分)

    7-24 喊山 (30 分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的& ...

  3. PTA 08-图7 公路村村通 (30分)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道 ...

  4. PTA 1014 Waiting in Line (30分) 解题思路及满分代码

    题目 Suppose a bank has N windows open for service. There is a yellow line in front of the windows whi ...

  5. PTA 社交网络图中结点的“重要性”计算(30 分)

    7-12 社交网络图中结点的“重要性”计算(30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互 ...

  6. 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历

    二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历   二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则 ...

  7. PTA 11-散列4 Hard Version (30分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/680 5-18 Hashing - Hard Version   (30分) Given ...

  8. PTA 05-树9 Huffman Codes (30分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/671 5-9 Huffman Codes   (30分) In 1953, David ...

  9. PTA 04-树6 Complete Binary Search Tree (30分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/669 5-7 Complete Binary Search Tree   (30分) A ...

随机推荐

  1. 使用openlivewriter编写cnblogs博客

    下载OpenLiveWriter 下载地址:http://openlivewriter.org/ 安装OpenLiveWriter 1.账号配置 2.常规操作,省略- 安装高亮插件 1.下载插件:ht ...

  2. Python(Head First)学习笔记:二

    2 共享代码:连接共享社区.语法.函数.技巧 通过Python模块共享代码,在Python社区分享这些模块,让更多的人受益, 不得不说,Python真的做的不错~ Python提供了一组技术,用于模块 ...

  3. Vue中的slot(占坑,预留位置)

    Vue中的slot(占坑,预留位置) 子模板不使用slot 子模板使用slot 子模板使用使用name属性,且传递data 文件名:Slots.vue //slot组件 <template> ...

  4. 线上问题排查神器 Arthas

    线上问题排查神器 Arthas 之前介绍过 BTrace,线上问题排查神器 BTrace 的使用,也说它是线上问题排查神器.都是神器,但今天这个也很厉害,是不是更厉害不好说,但是使用起来非常简单.如果 ...

  5. Linux 笔记 - 第九章 Linux 中软件的安装

    博客地址:http://www.moonxy.com 一.前言 在 Linux 系统中,应用程序的软件包主要分为两种:1)第一种是二进制的可执行软件包,也就是解开包后就可以直接运行.在 Windows ...

  6. DirectX12 3D 游戏开发与实战第二章内容

    矩阵代数 学习目标 理解矩阵及其相关运算的定义 探究为何能把向量和矩阵的乘法视为一种线性组合 学习单位矩阵.转置矩阵.行列式以及矩阵的逆等概念 逐步熟悉DirectXMath库中提供的关于矩阵计算的类 ...

  7. 运用 CSS methodologies 去实现模块化

    一.什么是 CSS methodologies CSS methodologies,可以理解成 设计模式,也可以理解成 css 规范,市面使用情况如下图: 上图来源:https://2019.stat ...

  8. JavaScript之基本概念(一)

    在我们学习一门编程语言之前,我们应该先了解它的一些基本概念,包括它是什么,它能用来干什么,怎么用等等.这部分内容建议学习时间一天. 一 何为‘JavaScript’ 1 .    什么是JavaScr ...

  9. 判断java中最多的词组

    其中的难点,是空格,以及如果第一个是空格怎么办,虽然事后看着很简单,但是做的时候却十分的困难! static void Daunyu()throws IOException {     Word wo ...

  10. CF #579 (Div. 3) C.Common Divisors

    C.Common Divisors time limit per test2 seconds memory limit per test256 megabytes inputstandard inpu ...