动态规划:72. 编辑距离
时间:2020-03-26
本文章向大家介绍动态规划:72. 编辑距离,主要包括动态规划:72. 编辑距离使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
72. 编辑距离
题目要求:
解题思路:
根据动态规划的步骤:
1. 定义数组元素的含义,这里用到两个字符串,所以应该定义二维数组;
由于我们求的是字符串1转换成字符串2所需要的最少次数:当字符串1的长度为i,字符串2的长度为j,则字符串1转换成字符串2所需次数为dp[i][j];
2. 找出关系数组之间的关系式;
大部分情况下, dp[i] [j] 和 dp[i-1] [j]、 dp[i] [j-1]、 dp[i-1] [j-1] 肯定存在某种关系。
这里题目也给出了提示:插入,删除,替换操作
大体上分三种情况:
1)替换的情况:当word1中的前i-1个就可以变换为word2中的前j-1个,那么我们只要根据word1中的第i个是否等于word2中的第j个字符进行判断,
如果相等,那么cost[i][j]=cost[i-1][j-1]; 否则,cost[i][j]=cost[i-1][j-1]+1,加的1就是我们将word1中第i个字符替换为word2中第j个的消耗。
2)删除的情况:当word1中的前i-1个就可以变换为word2中的前j个时,我们需要将word1中的第i个字符删除,cost[i][j]=cost[i-1][j]+1;
3)增加的情况:当word1中的前i个可以变换为word2中的前j-1个时,我们需要将word1中的第i个字符后面增加一个,cost[i][j]=cost[i][j-1]+1;
所以,我们的cost[i][j]取上列的最小值即可。
1 class Solution { 2 public: 3 int minDistance(string word1, string word2) 4 { 5 int m = word1.length(); 6 int n = word2.length(); 7 int dp[m+1][n+1]; //相对下面两个,比较省内存 8 //vector<vector<int>>dp(m+1,vector<int>(n+1,0)); //非常耗内存 9 //动态申请数组二维dp 大小:(m+1)*(n+1) //耗内存 10 // int **dp = new int*[m+1]; 11 // for(int i=0; i<=m; i++) 12 // { 13 // dp[i] = new int[n+1]; 14 // } 15 dp[0][0] = 0; 16 for (int i=1; i <= m; i++) 17 { 18 //dp[i][0] = dp[i-1][0] + 1; 19 dp[i][0] = i; 20 } 21 for (int i=1; i <= n; i++) 22 { 23 //dp[0][i] = dp[0][i-1] + 1; 24 dp[0][i] = i; 25 } 26 for (int i=1; i <= m; i++) 27 { 28 for (int j=1; j <= n; j++) 29 { 30 //strcmp(word1.c_str(),word2.c_str()) 31 if (word1[i-1]==word2[j-1]) 32 { 33 dp[i][j] = dp[i-1][j-1]; 34 } 35 else 36 {
//无需手动写函数,直接使用C++中自动的宏定义:#define min(a,b) ( ((a)>(b)) ? (b):(a) ) 37 dp[i][j]=min(min(dp[i-1][j-1], dp[i][j-1] ), dp[i-1][j] ) + 1; 38 } 39 } 40 } 41 return dp[m][n]; 42 } 43 44 // int mindata(int a, int b) 45 // { 46 // return ((a > b)? b:a); 47 // } 48 };
原文地址:https://www.cnblogs.com/Tavi/p/12573088.html
- android多线程下载3
- android多线程下载2
- android多线程下载1
- ASP获取微信小程序的OpenID服务器端代码
- 手把手教你用python抢票回家过年 !(附代码)
- 技术总结:自动扩张WPF树型表格列宽
- 部署Microsoft .NET Framework 3.0[翻译]
- 性能优化总结(六):预加载、聚合SQL应用实例
- 性能优化总结(五):CSLA服务端如何使用多线程的解决方案
- 编辑-发布-开发分离:git作为NoSQL数据库
- 性能优化总结(四):预加载的设计
- 在Expression Blend中使用XAML建立3D应用程序
- 使用 Asp.net Future May 2007 开发Silverlight应用
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- IDEA Pycharm WebStorm JetBranis全版本 2020年 最新激活方式
- SpringBoot整合MyBatis
- Sublime Text 3解决中文乱码
- pyPI: Python计算热带气旋潜在强度(Potential Intensity, 数据+代码)
- CVE-2019-0808 从空指针解引用到权限提升
- 打卡群刷题总结0926——零钱兑换
- 这样写的代码,都是垃圾......
- 打卡群刷题总结0928——整数拆分
- 面试官最爱问的 11道 Redis 面试题,我替你整理好了
- 打卡群刷题总结0929——计算各个位数不同的数字个数
- codeforces 1423K(数学+差分数组预处理)
- 电影大片里的代码究竟有多高级?
- 打卡群刷题总结0930——最大整除子集
- 机器学习中的常用编码方式(一)
- leetcode题目之1、2---两数相加