链接:https://www.nowcoder.com/questionTerminal/9649617be3bf42288f50758df4310655
来源:牛客网

UNIX系统下有一个行编辑器ed,它每次只对一行文本做删除一个字符、插入一个字符或替换一个字符三种操作。例如某一行的内容是“ABC”,经过把第二个字符替换成“D”、删除第一个字符、末尾插入一个字符“B”,这三步操作后,内容就变成了“DCB”。即“ABC”变成“DCB”需要经过3步操作,我们称它们的编辑距离为3。

现在给你两个任意字符串(不包含空格),请帮忙计算它们的最短编辑距离。

思路分析:

此题是一道动态规划类的题目,这类题目不是特别的难,下面分享一下我的做题思路。

拿到一道动态规划类的题目要做的有三件事:

1、阅读理解题目,并且简化问题。

2、设定初始值,填表。

3、在表格的数据当中寻找规律。

由于动态规划类的题目,它的下一个结果仅仅取决于上一次填表的结果,这样一层一层迭代下来最终就能得到想要的结果。填表的过程要严格遵循题目指定的规则。

我们来看这道题的表格:

一般初值的设定不是一成不变的,需要根据题目来自己尝试,并不是一次就能成功的所以有时候需要一点灵感。可以看到我用颜色标记出来的是设定的初值。填完表之后,在表中找规律,发现要是正好在对角线上的两个字符相等那么就取它左上角的数字。要是不相同就去它上面、左面、左上的元素中最小值再加1,在表的右下角就是最终的结果。

在填表的时候要填什么数字完全是按照规则来的,填完之才能够找规律。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
/* 它每次只对一行文本做删除一个字符、插入一个字符或替换一个字符三种操作 */
int deal_shortest(string str1, string str2)
{int len1 = str1.size();int len2 = str2.size();int i = 0;int j = 0;vector<vector<int>> m_v(len1+1,vector<int>(len2+1,0));//生成二维数组用于填表/* 设定初始值 ,vector一旦设定存储空间那么它就成了C语言中的数组,存在边界*/m_v[0][0] = 0;for (i=1;i<=len1;++i){m_v[i][0] = i;}for (i=1;i<=len2;++i){m_v[0][i] = i;}for (i=1;i<=len1;++i){for (j=1;j<=len2;++j){if (str1[i-1]==str2[j-1]){m_v[i][j] = m_v[i - 1][j - 1];}else{m_v[i][j] = min(m_v[i][j - 1], min(m_v[i - 1][j - 1], m_v[i - 1][j]))+1;}}}return m_v[len1][len2];
}
int main()
{string str1;string str2;while (cin>>str1>>str2){cout<<deal_shortest(str1, str2)<<endl;str1.clear();str2.clear();}system("pause"); return 0;
}

最短编辑距离(动态规划超详细填表法)相关推荐

  1. C++动态规划超详细总结

    动态规划 首先来介绍一下动态规划,但我不想用过于官方的语言来介绍.动态规划是一种思想,它常用于最优解问题(即所有问题包括所有子问题的解为最优解),它有点像递推,是在已知问题的基础上解决其他问题.这种思 ...

  2. 动态规划27k字超详细保姆级入门讲解——附DP经典线性、区间、二维图、四维8个模型题解

    动态规划27k字超详细保姆级入门讲解 写在前面: 这篇文章是目前为止我写过最长也是最久的文章,前面关于DP的讲解我查阅了大量的博客资料,学习其他博主对DP的理解,也翻阅了很多经典的纸质书籍,同时做了近 ...

  3. 经典动态规划问题:最短编辑距离算法的原理及实现

    编辑距离的定义 编辑距离(Edit Distance)最常用的定义就是Levenstein距离,是由俄国科学家Vladimir Levenshtein于1965年提出的,所以编辑距离一般又称Leven ...

  4. 动态规划最常见的习题 (最长公共子串、最长公共子序列、最短编辑距离)

    (1)理论部分: (2)习题: 最长公共子串: 1 package month7.dp; 2 3 //https://www.nowcoder.com/questionTerminal/181a1a7 ...

  5. 电脑技巧全书(超详细.)

    目录检索(相关文章在对应的目录下找~~)~~ 1.最全的windows操作系统快捷键-------------------------------------1楼   2.Windows 开始→运行→ ...

  6. stm32正常运行流程图_STM32单片机学习笔记(超详细整理143个问题,学习必看)...

    原标题:STM32单片机学习笔记(超详细整理143个问题,学习必看) 1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2.Stm32f ...

  7. 超详细的计算机网络基础知识总结 第三章:数据链路层

    本文基于:王道计算机考研-计算机网络 其他文章: 超详细的计算机网络基础知识 第一章:概述 超详细的计算机网络基础知识 第二章:物理层 超详细的计算机网络基础知识 第四章:数据链路层 超详细的计算机网 ...

  8. 经典神经网络论文超详细解读(二)——VGGNet学习笔记(翻译+精读)

    前言 上一篇我们介绍了经典神经网络的开山力作--AlexNet:经典神经网络论文超详细解读(一)--AlexNet学习笔记(翻译+精读) 在文章最后提及了深度对网络结果很重要.今天我们要读的这篇VGG ...

  9. java面试题答案大全超详细(持续更新)

    java面试题答案大全超详细 第01章 java语言面试题 项目经理(作者):张明星 JVM 运行时数据区是什么? 程序计数器是什么? 程序计数器(线程私有) Java 虚拟机栈的作用? 本地方法栈的 ...

最新文章

  1. Java中的泛型 --- Java 编程思想
  2. 字符串数组的排序c++_Java——数组相关知识点及练习演绎
  3. 通过AT指令控制ESP8266
  4. vue ---- vue 的入门程序
  5. esp8266教程:文件系统之spiffs
  6. c语言常见输入输出格式简单介绍
  7. 雷达测距测速测角基本原理
  8. 部署bugzilla(bugzilla+apache+mysql+linux)
  9. CAGD(计算机辅助几何设计)大作业
  10. 大数据使磁带重获新生
  11. python中的随机数种子seed()
  12. 宏基aspire 4920 win10录音没有声音解决方法
  13. Deep-Residual-Shrinkage-Networks模型
  14. 禁止Altium designer(其他软件同样适用)联网的配置操作
  15. 【Niagara 04】Tridium N4使用——生成报警信息
  16. 基于html2canvas实现网页保存为图片及图片清晰度优化
  17. mac登录腾讯企业邮箱
  18. (0105)iOS开发之iOS13 暗黑模式(Dark Mode)适配
  19. JavaScript高德地图中绘制echarts图表随地图移动
  20. 什么是AES对称加密算法

热门文章

  1. (转)介绍Linux操作系统下的几个小游戏模拟器
  2. Photo Album: 2008年6月泰康路田子坊-时尚与世俗并存
  3. 玩转支付宝、微信零钱通、银行活期
  4. STM32F4新建寄存器版本MDK(Keil5)工程(正点原子)
  5. 韩信点兵问题,即使没有学过数论也能看得懂
  6. php 递归生成树形菜单,递归生成树形结构菜单
  7. 购买财务软件需要注意的4个方面
  8. maven 的 pom 文件与打包详解
  9. python文件如何打包生成.exe文件?(打包教程)
  10. 南海将打造“区块链+”金融科技产业高地