dp3--codevs2598 编辑距离问题
dp3--codevs2598 编辑距离问题
一、心得
1、字符串相关问题dp的时候从0开始是个陷阱
二、题目
设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括:
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符。
将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。试编写程序,对任给的2个字符串A和B,计算出它们的编辑距离d(A,B)。
输入文件edit.in有两行,第一行是字符串A,第二行是字符串B。
输出文件edit.out只有一行,即编辑距离d(A,B)。
fxpimu
xwrs
5
40%的数据字符串A、B的长度均不超过100;
100%的数据字符串A、B的长度均不超过4000。
三、分析
* codeVs2598编辑距离.cpp
* 分析:
* 状态:
* f[i][j]表示串s1的前i个字符和串s2的前j个字符的编辑距离
* 最终状态:
* f[len_s1][len_s2]
* 初始状态:
* f[i][0]=i;f[0][j]=j
* 状态转移方程:
* f[i][j]=f[i-1][j-1]; (s1[i]==s2[j])
* f[i][j]=min(f[i-1][j-1],f[i-1][j],f[i][j-1])+1; (s1[i]!=s2[j])

上图为初始化及分析过程

上图为dp数组结果
四、AC代码
94ms
/*
* codeVs2598编辑距离.cpp
* 分析:
* 状态:
* f[i][j]表示串s1的前i个字符和串s2的前j个字符的编辑距离
* 最终状态:
* f[len_s1][len_s2]
* 初始状态:
* f[i][0]=i;f[0][j]=j
* 状态转移方程:
* f[i][j]=f[i-1][j-1]; (s1[i]==s2[j])
* f[i][j]=min(f[i-1][j-1],f[i-1][j],f[i][j-1])+1; (s1[i]!=s2[j])
*
*/ #include <iostream>
#include <string>
#include <cstdio>
using namespace std;
string s1, s2;
int f[][];
int len_s1, len_s2; void readData() {
cin >> s1 >> s2;
} void printRead() {
cout << s1 << endl << s2 << endl;
} void initLen() {
len_s1 = s1.length();
len_s2 = s2.length();
} void printLen() {
cout << len_s1 << endl << len_s2 << endl;
} void initArr_f() {
//f数组最初的初始化
for (int i = ; i <= len_s1; i++) {
for (int j = ; j <= len_s2; j++) {
f[i][j] = 0xfffff;
}
}
//0列
for (int i = ; i <= len_s1; i++) {
f[i][] = i;
}
//0行
for (int j = ; j <= len_s2; j++) {
f[][j] = j;
}
} void printArr_f() {
for (int i = ; i <= len_s1; i++) {
for (int j = ; j <= len_s2; j++) {
printf("%8d ", f[i][j]);
}
cout << endl;
}
} void init() {
readData();
//printRead();
initLen();
//printLen();
initArr_f();
//printArr_f();
} int min3(int a,int b,int c){
return min(min(a,b),c);
} void dp() {
for (int i = ; i <= len_s1; i++) {
for (int j = ; j <= len_s2; j++) {
if(s1[i-]==s2[j-]) f[i][j]=f[i-][j-];
else{
f[i][j]=min3(f[i-][j-],f[i-][j],f[i][j-])+;
}
}
}
} void printAns(){
cout<<f[len_s1][len_s2]<<endl;
} int main() {
//freopen("src/codeVs2598in.txt", "r", stdin);
init();
dp();
//printArr_f();
printAns();
return ;
}
/*
* 注意点:
* 1、f数组最初的初始化不能忘记
* f[i][j] = 0xfffff;
* 2、if(s1[i-1]==s2[j-1])这里忘记写减1了
* 字符串从0开始
*/
五、注意点
1、f数组最初的初始化不能忘记
f[i][j] = 0xfffff;
2、if(s1[i-1]==s2[j-1])这里忘记写减1了
字符串从0开始
dp3--codevs2598 编辑距离问题的更多相关文章
- [LeetCode] One Edit Distance 一个编辑距离
Given two strings S and T, determine if they are both one edit distance apart. 这道题是之前那道Edit Distance ...
- C#实现Levenshtein distance最小编辑距离算法
Levenshtein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致.该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑 ...
- 利用Levenshtein Distance (编辑距离)实现文档相似度计算
1.首先将word文档解压缩为zip /** * 修改后缀名 */ public static String reName(String path){ File file=new File(path) ...
- Levenshtein Distance算法(编辑距离算法)
编辑距离 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符, ...
- 编辑距离——Edit Distance
编辑距离 在计算机科学中,编辑距离是一种量化两个字符串差异程度的方法,也就是计算从一个字符串转换成另外一个字符串所需要的最少操作步骤.不同的编辑距离中定义了不同操作的集合.比较常用的莱温斯坦距离(Le ...
- 编辑距离及其动态规划算法(Java代码)
编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.一般情况下编辑操作包括: 将一个字符替换成另一个字符: 插入一个字符: 删除一个字 ...
- stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)
I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...
- leetcode72. Edit Distance(编辑距离)
以下为个人翻译方便理解 编辑距离问题是一个经典的动态规划问题.首先定义dp[i][j表示word1[0..i-1]到word2[0..j-1]的最小操作数(即编辑距离). 状态转换方程有两种情况:边界 ...
- 准备NOIP2017 编辑距离问题 模板
输入 第1行:字符串a(a的长度 <= 1000). 第2行:字符串b(b的长度 <= 1000). 输出 输出a和b的编辑距离 输入示例 kitten sitting 输出示例 ...
随机推荐
- 简述Python的深浅拷贝以及应用场景
深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...
- 视频解码芯片SAA7111A的初始化
为了完成SAA7111A的初始化,FPGA需要完成I2C控制器的设计. 之前本科的时候初步接触过I2C,但是编写一个Verilog的控制器还是觉得有点难度的.说实话,那时候都无从下手,对实现这样一个协 ...
- 4.4 使用STM32控制MC20进行GPS帧数据解析
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- linux shell 入门
本文是本人学习linux shell入门收集整理,不完全原创. 参考博文: http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html ...
- Django为什么要跳转到不同的页面来实现不同的功能
其实是不同将信息提交给不同的页面交给不同的页面去处理同一个数据库,不同的模块实现不同的功能,当要实现某一个功能的时候直接跳转到那一个功能下面的url,可以把要实现的功能区分开,以python面向对象的 ...
- Linux:文件系统
Linux:文件系统 分区与文件系统 对分区进行格式化是为了在分区上建立文件系统.一个分区通常只能格式化为一个文件系统,但是磁盘阵列等技术可以将一个分区格式化为多个文件系统. 组成 最主要的组成部分如 ...
- Linux CentOS7安装Mysql5.7
一.下载mysql mkdir /home/install #创建install目录 在/home/install目录下下载mysql5.7 wget https://cdn.mysql.com//D ...
- for语句中多重定义
"}; vector<string> vecStr(Arr, Arr + sizeof(Arr)/sizeof(string)); , sz = vecStr.size(); i ...
- python中类(class)和实例(instance)
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...
- Docker容器技术-基础与架构
一.什么是容器 容器是对应用程序及其依赖关系的封装. 1.容器的优点 容器与主机的操作系统共享资源,提高了效率,性能损耗低 容器具有可移植性 容器是轻量的,可同时运行数十个容器,模拟分布式系统 不必花 ...