最短编辑距离(动态规划超详细填表法)
链接: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;
}
最短编辑距离(动态规划超详细填表法)相关推荐
- C++动态规划超详细总结
动态规划 首先来介绍一下动态规划,但我不想用过于官方的语言来介绍.动态规划是一种思想,它常用于最优解问题(即所有问题包括所有子问题的解为最优解),它有点像递推,是在已知问题的基础上解决其他问题.这种思 ...
- 动态规划27k字超详细保姆级入门讲解——附DP经典线性、区间、二维图、四维8个模型题解
动态规划27k字超详细保姆级入门讲解 写在前面: 这篇文章是目前为止我写过最长也是最久的文章,前面关于DP的讲解我查阅了大量的博客资料,学习其他博主对DP的理解,也翻阅了很多经典的纸质书籍,同时做了近 ...
- 经典动态规划问题:最短编辑距离算法的原理及实现
编辑距离的定义 编辑距离(Edit Distance)最常用的定义就是Levenstein距离,是由俄国科学家Vladimir Levenshtein于1965年提出的,所以编辑距离一般又称Leven ...
- 动态规划最常见的习题 (最长公共子串、最长公共子序列、最短编辑距离)
(1)理论部分: (2)习题: 最长公共子串: 1 package month7.dp; 2 3 //https://www.nowcoder.com/questionTerminal/181a1a7 ...
- 电脑技巧全书(超详细.)
目录检索(相关文章在对应的目录下找~~)~~ 1.最全的windows操作系统快捷键-------------------------------------1楼 2.Windows 开始→运行→ ...
- stm32正常运行流程图_STM32单片机学习笔记(超详细整理143个问题,学习必看)...
原标题:STM32单片机学习笔记(超详细整理143个问题,学习必看) 1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2.Stm32f ...
- 超详细的计算机网络基础知识总结 第三章:数据链路层
本文基于:王道计算机考研-计算机网络 其他文章: 超详细的计算机网络基础知识 第一章:概述 超详细的计算机网络基础知识 第二章:物理层 超详细的计算机网络基础知识 第四章:数据链路层 超详细的计算机网 ...
- 经典神经网络论文超详细解读(二)——VGGNet学习笔记(翻译+精读)
前言 上一篇我们介绍了经典神经网络的开山力作--AlexNet:经典神经网络论文超详细解读(一)--AlexNet学习笔记(翻译+精读) 在文章最后提及了深度对网络结果很重要.今天我们要读的这篇VGG ...
- java面试题答案大全超详细(持续更新)
java面试题答案大全超详细 第01章 java语言面试题 项目经理(作者):张明星 JVM 运行时数据区是什么? 程序计数器是什么? 程序计数器(线程私有) Java 虚拟机栈的作用? 本地方法栈的 ...
最新文章
- Java中的泛型 --- Java 编程思想
- 字符串数组的排序c++_Java——数组相关知识点及练习演绎
- 通过AT指令控制ESP8266
- vue ---- vue 的入门程序
- esp8266教程:文件系统之spiffs
- c语言常见输入输出格式简单介绍
- 雷达测距测速测角基本原理
- 部署bugzilla(bugzilla+apache+mysql+linux)
- CAGD(计算机辅助几何设计)大作业
- 大数据使磁带重获新生
- python中的随机数种子seed()
- 宏基aspire 4920 win10录音没有声音解决方法
- Deep-Residual-Shrinkage-Networks模型
- 禁止Altium designer(其他软件同样适用)联网的配置操作
- 【Niagara 04】Tridium N4使用——生成报警信息
- 基于html2canvas实现网页保存为图片及图片清晰度优化
- mac登录腾讯企业邮箱
- (0105)iOS开发之iOS13 暗黑模式(Dark Mode)适配
- JavaScript高德地图中绘制echarts图表随地图移动
- 什么是AES对称加密算法