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星号*与**用法分析 What does ** (double star/asterisk) and * (star/asterisk) do for parameters? 必选参数 默认参数 可变参数 关键字参数
python中*号**的区别 - CSDN博客 https://blog.csdn.net/qq_26815677/article/details/78091452 定义可变参数和定义 list 或 ...
- Docker Metasploit Framework
https://hub.docker.com/r/usertaken/metasploit-framework/ docker pull usertaken/metasploit-framework ...
- Python菜鸟之路:Django 数据库操作进阶F和Q操作
Model中的F F 的操作通常的应用场景在于:公司对于每个员工,都涨500的工资.这个时候F就可以作为查询条件 from django.db.models import F models.UserI ...
- AWS入门-1
对于 Amazon Linux AMI,用户名为 ec2-user. 对于 RHEL AMI,用户名称是 ec2-user 或 root. 对于 Ubuntu AMI,用户名称是 ubuntu 或 r ...
- boost之正确性和测试
BOOST_ASSERT在debug模式下有效. #include <iostream> #include <boost/assert.hpp> using namespace ...
- Overload and Override without Overwrite - Java
Override(覆盖/覆写): 子类Override父类中的函数(方法).Overload(重载): 同一个类中包含多个同名的函数(方法), 但各个函数的参数列表不同. Override和Overl ...
- 联合文件系统 unionfs
- 教你在Yii2.0框架中如何创建自定义小部件
本教程将帮助您创建自己的自定义小部件在 yii framework 2.0.部件是可重用的模块和用于视图. 创建一个小部件,需要继承 yii\base\Widget,覆盖重写 yii\base\Wid ...
- 导入Frameworks 死活引用不Liao头文件
向工程中拖入或add file时可能会出现Frameworks导入,但是在添加该Frameworks后却引用不到相应的头文件 打开工程文件目录发现frameworks所在的路径并不存在,而是直接在工程 ...
- css系列(7)成品网页
本节介绍用css和html组合起来写的页面.(代码可以直接运行) (1)仿旧版腾讯微博注册页面:(文件夹地址:http://files.cnblogs.com/files/MenAng ...