题目

题目描述

设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. CentOS 7操作系统安装

    1.关于运维小伙伴可以采用何种方式安装操作系统 下面列举的只是我会用到的安装方式,在运维过程中并不一定是最优解,只是自己运维过程中的一些经验. (1)物理服务器,可以通过连接管理口来安装操作系统,管理 ...

  2. 链表 Linked List

    目录 链表介绍 单链表 单链表的应用实例 添加-直接添加到末尾 添加-顺序添加 更新 删除 单链表的面试题 双链表 链表介绍 链表时有序的列表,但是它在内存中是存储如下 小结 链表是以节点的方式来存储 ...

  3. vim中字符串的替换

    vi/vim 中可以使用 :s 命令来替换字符串 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky : ...

  4. 在linux查询本机的公网IP

    linux服务器查看公网IP信息的方法 最近在解决网络问题时,需要查看本机的出口公网IP信息,所以在网络上搜索和请求运维达人,获得如下两个方法: curl ifconfig.me 在linux系统中输 ...

  5. Elaticsearch基础概念

    概述 elaticsearch是一个分布式的搜索引擎,它可以实现各种复杂的数据类型实现近实时的搜索功能,无论是结构化还是非结构化的数据,都能使用elaticsearch存储并且可以快速搜索.elati ...

  6. HTML+CSS设计个人主页

    在个人主页的设计中,我采用了圣代布局和div分块.效果图如下: <!DOCTYPE html> <html lang="en"> <head> ...

  7. fillder 抓包工具详解

    一.安装详解 直接点击.exe可执行文件,一直下一步直到安装完成即可.打开主要为5个部分: 二.安装jmeter插件详解 三.工具详解 3.1:工具条:,可以给指定的请求添加备注信息,在导出后可以查看 ...

  8. P4606-[SDOI2018]战略游戏【圆方树,虚树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4606 题目大意 给出\(n\)个点\(m\)条边的一张图,\(q\)次询问给出一个点集,询问有多少个点割掉后可以 ...

  9. P2490-[SDOI2011]黑白棋【博弈论,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P2490 题目大意 一个长度为\(n\)的棋盘上放下\(k\)个棋子. 第一个要是白色,下一个要是黑色,在下一个是白 ...

  10. 聊聊并发(一)——初始JUC

    一.volatile 1.介绍 JDK 5.0 提供了java.util.concurrent包,在此包中增加了并发编程中很常用的使用工具类,用于定义类似于线程的自定义子系统,包括线程池.异步IO和轻 ...