PTA 7-3 编辑距离问题 (30 分)
一、实践题目
设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 分)的更多相关文章
- PTA 7-1 公路村村通 (30分)
PTA 7-1 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N ...
- PTA 练习 7-24 喊山 (30 分)
7-24 喊山 (30 分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的& ...
- PTA 08-图7 公路村村通 (30分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道 ...
- 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 ...
- PTA 社交网络图中结点的“重要性”计算(30 分)
7-12 社交网络图中结点的“重要性”计算(30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互 ...
- 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历
二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历 二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则 ...
- PTA 11-散列4 Hard Version (30分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/680 5-18 Hashing - Hard Version (30分) Given ...
- 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 ...
- 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 ...
随机推荐
- Java,哈希码以及equals和==的区别
从开始学习Java,哈希码以及equals和==的区别就一直困扰着我. 要想明白equals和==的区别首先应该了解什么是哈希码,因为在jdk的类库中不管是object实现的equals()方法还是S ...
- Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现
介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是 ...
- 一个Android 架构师的成长之路
前言 总所周知,当下流行的编程语言有Java.PHP.C.C++.Python.Go等.其中,稳坐榜首的仍然是Java编程语言,且在以面向对象思想占主导的应用开发中,Java往往成为其代名词.Java ...
- 【Python爬虫】第四课(查询照片拍摄地址)
首先,要能够查询到照片地址,查询的照片必须要开GPS拍,且上传时用原图…… 查询图片的exif信息,使用exifread包 import exifread img = exifread.process ...
- CF #579 (Div. 3) D1.Remove the Substring (easy version)
D1.Remove the Substring (easy version) time limit per test2 seconds memory limit per test256 megabyt ...
- Java 代理模式 (二) 动态代理
代理模式 代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式:即通过代理访问目标对象. 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作.(扩展目标对象的功能). 代理模式的 ...
- layer.open打开一个新的jsp页面,如何关闭并刷新父页面问题
layer.open打开一个新的jsp页面弹框,如何关闭呢? 在新的页面提交完毕之后,关闭并刷新父页面列表. layer.closeAll(); parent.layer.closeAll(); wi ...
- svn报错Item is not readable svn解决方案
解决: 配置目录权限时如: [/]tangtx=rwyangcx=rwweishq=rw 结果组用户分别在根目录下可以正常show log,而在其子目录中show log都会提示 Item is no ...
- angular 配置开发环境、测试环境、生产环境
1. 配置开发环境.测试环境.生产环境 (1). environment.ts - 开发环境: 用于程序开发 (创建项目时自动生成) export const environment = { prod ...
- 03-css的继承性和层叠性
一.继承性 css中所谓的继承,就是子集继承父级的属性. 可以继承的属性:color.font-xxx.text-xxx.line-xxx.(主要是文本级的标签元素) 但是,像一些盒子元素属性,定位的 ...