题目

题目描述

设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:

1、删除一个字符;

2、插入一个字符;

3、将一个字符改为另一个字符;

!皆为小写字母!

输入格式

第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。

输出格式

只有一个正整数,为最少字符操作次数。

输入输出样例

输入 #1

sfdqxbw
gfdgw

输出 #1

4

题目分析

当前的状态会影响到后续的状态。

我们可以考虑DP

设\(dp_{i,j}\)表示把\(a_{1\dots i}\) 转换为\(b_{1\dots j}\)需要的最少步数

那么\(dp_{i,j}\)应该就由四种状态转移过来:立改废存

  1. 什么都不变

这样需要\(a_i=b_j\),然后直接\(dp_{i,j}=dp_{i-1,j-1}\),也就是直接接下来就可以了

  1. 插入操作之后得到

那么就应该是让\(a_{1\dots i}\)操作得到\(b_{1\dots j-1}\),那么只需要在\(a_i\)后面插入\(b_j\),就可以把\(a_i\)转换成\(b_{j-1}\)之后再加一步,即\(dp_{i,j}=dp_{i,j-1}+1\)就可以得到\(b_{j}\)

  1. 删除操作之后得到

就应该让\(a_{1\dots i-1}\)操作之后得到\(b_{1\dots j}\),然后再把\(a_i\)删掉,就能通过\(a_i\)得到\(b_j\),即\(dp_{i,j}=dp_{i-1,j}+1\)

  1. 替换操作之后得到

那么就是\(a_{i-1}\)操作之后得到\(b_{j-1}\),然后把\(a_i\)改成\(b_j\),前提是\(a_i\neq b_j\),即\(dp_{i,j}=dp_{i-1,j-1}+1\)

如果\(a_i=b_j\),那么就直接接下来,否则就剩下三种情况的最小值。

状态转移方程

\[dp_{i,j}=
\begin{cases}
dp_{i-1,j-1} & a_i=b_j \\
\min(dp_{i-1,j},dp_{i,j-1},dp{i-1,j-1})+1 & a_i \neq b_j
\end{cases}
\]

初始状态

可以知道初始状态应该是\(dp_{i,0}\)和\(dp_{0,j}\)

也很容易得到把\(a_{1\dots i}\) 变成0(没有串)需要删除\(i\)步

同样\(dp_{0,j}=j\)

结束状态

\(dp_{lena,lenb}\)

Code

#include <cstdio>
#include <cstring>
#include <iostream> int lena,lenb;
char a[2001],b[2001];
int dp[2001][2001]; int main()
{
scanf("%s%s",a+1,b+1);
lena=strlen(a+1); lenb=strlen(b+1);
for(register int i=1;i<=lena;++i)
{
dp[i][0]=i;
for(register int j=1;j<=lenb;++j)
{
dp[0][j]=j;
if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]; else
{
dp[i][j]=std::min(std::min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1;
}
}
}
printf("%d\n",dp[lena][lenb]);
return 0;
}

[LGP2758]编辑距离的更多相关文章

  1. [LeetCode] One Edit Distance 一个编辑距离

    Given two strings S and T, determine if they are both one edit distance apart. 这道题是之前那道Edit Distance ...

  2. C#实现Levenshtein distance最小编辑距离算法

    Levenshtein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致.该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑 ...

  3. 利用Levenshtein Distance (编辑距离)实现文档相似度计算

    1.首先将word文档解压缩为zip /** * 修改后缀名 */ public static String reName(String path){ File file=new File(path) ...

  4. Levenshtein Distance算法(编辑距离算法)

    编辑距离 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符, ...

  5. 编辑距离——Edit Distance

    编辑距离 在计算机科学中,编辑距离是一种量化两个字符串差异程度的方法,也就是计算从一个字符串转换成另外一个字符串所需要的最少操作步骤.不同的编辑距离中定义了不同操作的集合.比较常用的莱温斯坦距离(Le ...

  6. 编辑距离及其动态规划算法(Java代码)

    编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.一般情况下编辑操作包括: 将一个字符替换成另一个字符: 插入一个字符: 删除一个字 ...

  7. stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)

    I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...

  8. leetcode72. Edit Distance(编辑距离)

    以下为个人翻译方便理解 编辑距离问题是一个经典的动态规划问题.首先定义dp[i][j表示word1[0..i-1]到word2[0..j-1]的最小操作数(即编辑距离). 状态转换方程有两种情况:边界 ...

  9. 准备NOIP2017 编辑距离问题 模板

    输入 第1行:字符串a(a的长度 <= 1000). 第2行:字符串b(b的长度 <= 1000). 输出   输出a和b的编辑距离   输入示例 kitten sitting 输出示例 ...

随机推荐

  1. Linux学习笔记--快捷键

    桌面 ALT+空格 打开窗口菜单 ALT+F1 聚焦到桌面左侧任务导航栏,可按上下键导航 ALT+F2     运行命令 ALT+F4 关闭窗口 ALT+TAB 切换程序窗口 PRINT 桌面截图 S ...

  2. [第二篇]——Docker 架构之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker 架构 Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统.比如官方镜像 ubuntu:16.04 就包含了完整的一 ...

  3. go中语句为什么不用加分号;结束

    不用人加 编译的时候自动加了分号; 编译器工作原理 首先,在一行中,寻找成对的符号,比如一对字符串的引号.一对圆括号,一对大括号 上述任务完成后,在一行中没有其他成对的标示,然后就在行尾追加分号; 所 ...

  4. vue-cli3项目中使用vue-ueditor-wrap

    Vue + UEditor + v-model 双向绑定 一.安装 1 npm i vue-ueditor-wrap 2 # 或者 3 yarn add vue-ueditor-wrap 二.下载文件 ...

  5. Centos 6.8 系统下安装RabbitMQ方法

    一,安装 RabbitMQ 首先要先安装 erlang 1,到erlang官网下载 OTP 19.0 Source File 2,解压 tar zvxf otp_src_19.0.tar.gz 3,c ...

  6. PHP 算法之 -- 计算器设计

    <?php//$exp='300+20*6-20'; $exp='71*2-50*3-3-67*6+80'; //14-15-3=-4 //定义一个数栈和一个符号栈 $numsStack=new ...

  7. Java线程类

    基础知识 线程状态 根据Thread.State类中的描述,Java中线程有六种状态:NEW,RUNNABLE,WAITING,TERMINATED,BLOCKED. 就绪状态(NEW):当线程对象调 ...

  8. 修改CentOS ll命令显示时间格式

    临时更改显示样式,当会话结束后恢复原来的样式: export TIME_STYLE='+%Y-%m-%d %H:%M:%S' 永久改变显示样式,更改后的效果会保存下来 修改/etc/profile文件 ...

  9. PolarDB PostgreSQL DDL同步原理

    概述 在共享存储一写多读的架构下,数据文件实际上只有一份.得益于多版本机制,不同节点的读写实际上并不会冲突.但是有一些数据操作不具有多版本机制,其中比较有代表性的就是文件操作.多版本机制仅限于文件内的 ...

  10. P6122-[NEERC2016]Mole Tunnels【模拟费用流】

    正题 题目链接:https://www.luogu.com.cn/problem/P6122 题目大意 给出\(n\)个点的一棵满二叉树,每个点有容量\(c_i\),\(m\)次从\(p_i\)处加一 ...