当前位置: 首页 > news >正文

Lintcode--008(编辑距离)

http://www.lintcode.com/en/problem/edit-distance/

2016-08-29

给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。

你总共三种操作方法:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符
样例

给出 work1="mart" 和 work2="karma"

返回 3

标签: 动态规划

 

解题:

此题为典型的动态规划问题,可以按照一般解题思路解决。

 

首先定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。

 

显然可以有如下动态规划公式:

 

  • if i == 0 且 j == 0,edit(i, j) = 0
  • if i == 0 且 j > 0,edit(i, j) = j
  • if i > 0 且j == 0,edit(i, j) = i
  • if i ≥ 1  且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。

实现代码如下:

class Solution {
public:    
    /**
     * @param word1 & word2: Two string.
     * @return: The minimum number of steps.
     */
    int minDistance(string word1, string word2) {
        // write your code here
        //@@@@@动态规划解题套路@@@@@
        //可以通过具体举例,模拟执行过程,绘制表格来找出规律!!!
        
        int w1=word1.length();
        int w2=word2.length();
        int dp[w1+1][w2+1];
        dp[0][0]=0;
        
        for(int i=0;i<w1;i++){
            dp[i+1][0]=i+1;
        }
        for(int j=0;j<w2;j++){
            dp[0][j+1]=j+1;
        }
        
        for( int i=0;i<w1;i++){
            for(int j=0;j<w2;j++){
                if(word1[i]==word2[j]){
                    dp[i+1][j+1]=dp[i][j];
                }
                else{
                    dp[i+1][j+1]=min(dp[i][j+1]+1,min(dp[i+1][j]+1,dp[i][j]+1));
                }
            }
        }
        return dp[w1][w2];
    }
};

总结:遇到这类题目,可以用套路来解题。不同的是,需要根据不同的要求写出某个子问题的解的表达式。有些可能不能直接一眼看出他们的关系,所以

           需要自己通过具体举例,模拟执行过程,最终归纳出结果。(多思考)

       

 

相关文章:

  • 安全狗服云iphone版 轻松管理服务器安全
  • Ajax来实现下拉框省市区三级联动效果(服务端基于express)
  • 登陆界面不输密码点一次登陆出现一个用户名和密码不能为空(点n个出现n个)...
  • 适合程序员的个人综合意外险,最高可保100万
  • 工业无线网络标准初步了解
  • 利用KVO监视一个view的frame
  • 操作系统的主要功能
  • ubuntu server 安装 mantis bug tracker 中文配置
  • String Format 的实现
  • 信息社会
  • 模板引擎Nvelocity实例
  • 闲聊产品】之三:点评 WWDC 2014
  • 判断Laravel Eloquent获取数据结果集是否为空
  • 具有先进的图像处理和图像识别技术的条码识别引擎2D Barcode Decoder DLL
  • HeadFirst 设计模式 04 工厂模式
  • [译]CSS 居中(Center)方法大合集
  • 30天自制操作系统-2
  • Angular 4.x 动态创建组件
  • ESLint简单操作
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • java2019面试题北京
  • Js基础知识(四) - js运行原理与机制
  • Leetcode 27 Remove Element
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • react 代码优化(一) ——事件处理
  • scrapy学习之路4(itemloder的使用)
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Webpack 4 学习01(基础配置)
  • 百度小程序遇到的问题
  • 缓存与缓冲
  • 微信小程序填坑清单
  • 新版博客前端前瞻
  • 一个JAVA程序员成长之路分享
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • ​queue --- 一个同步的队列类​
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #控制台大学课堂点名问题_课堂随机点名
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (4)STL算法之比较
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二)学习JVM —— 垃圾回收机制
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (转)原始图像数据和PDF中的图像数据
  • ***检测工具之RKHunter AIDE
  • **PHP二维数组遍历时同时赋值
  • .htaccess 强制https 单独排除某个目录
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 发送邮件
  • .NET 使用 XPath 来读写 XML 文件
  • .net 托管代码与非托管代码
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [BZOJ]4817: [Sdoi2017]树点涂色