题目

题目描述

设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. [第十六篇]——Docker 安装 CentOS之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker 安装 CentOS CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise ...

  2. 教你搞懂Jenkins安装部署!

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用 ...

  3. 1.24学习总结——HTML常见标签

    HTML 标签简写及全称 下表列出了 HTML 标签简写及全称: 标签 英文全称 中文说明 a Anchor 锚 abbr Abbreviation 缩写词 acronym Acronym 取首字母的 ...

  4. 再谈OAuth授权

    工作场景流程 大家都知道OAuth是用于第三方授权的,当你用其他的APP想访问微信账号的昵称.粉丝.联系人等信息,这里就需要微信进行授权,此时在APP的网页端是可以发现有微信登录的,点开会出现弹框,在 ...

  5. JScript.net

    参考网址一.JScript帮助指南 http://doc.51windows.net/jscript5/?url=/jscript5/dir.htm 参考网址二.以下网址列出的类,可以尝试一下,会有意 ...

  6. python多线程与_thread模块

    进程与线程 1.进程:计算机程序只是存储在磁盘中的可执行二进制(或其他类型)的文件.只有把他们加载到内存中并被操作系统调用,才具有其生命周期.进程则是一个执行中的程序.每个进程都拥有自己的地址空间,内 ...

  7. P6076-[JSOI2015]染色问题【组合数学,容斥】

    正题 题目链接:https://www.luogu.com.cn/problem/P6076 题目大意 给出\(n*m\)的网格,\(c\)种颜色涂色要求 每个格子可以染色也可以不染 每一行每一列至少 ...

  8. python读Excel方法(xlrd)

    在我们做平常工作或自动化测试中都会遇到操作excel,Python处理exc相当顺手,如何通过python操作excel,当然python操作excel的库有很多,比如pandas,xlwt/xlrd ...

  9. centos7.5离线安装Docker及容器运行报OCI runtime create failed 问题定位与解决

    前言 接上篇 <记一次centos挂载ceph存储的坑> 服务器重做了centos7.5版本的操作系统,剩下就是安装docker,考虑yum安装耗时较长,我一般都是直接安装二进制版本doc ...

  10. bash是什么?

    bash shell就是一个bash程序 ​ --解释器,启动器 ​ --解释器: ​ 用户交互输入 如vim 文本文件输入 脚本本质: !/bin/bash !/usr/bin/python 读取方 ...