Edit Distance

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

 

也就是说,就是将一个字符串变成另外一个字符串所用的最少操作数,每次只能增加、删除或者替换一个字符。
首先我们令word1和word2分别为:michaelab和michaelxy(为了理解简单,我们假设word1和word2字符长度是一样的),dis[i][j]作为word1和word2之间的Edit Distance,我们要做的就是求出michaelx到michaely的最小steps。

首先解释下dis[i][j]:它是指word1[i]和word2[j]的Edit Distance。dis[0][0]表示word1和word2都为空的时候,此时他们的Edit Distance为0。很明显可以得出的,dis[0][j]就是word1为空,word2长度为j的情况,此时他们的Edit Distance为j,也就是从空,添加j个字符转换成word2的最小Edit Distance为j;同理dis[i][0]就是,word1长度为i,word2为空时,word1需要删除i个字符才能转换成空,所以转换成word2的最小Edit Distance为i。下面及时初始化代码:

 

  vector<vector<int> > dis(row, vector<int>(col));
       for (int i = 0; i < row; i++) dis[i][0] = i;
       for (int j = 0; j < col; j++) dis[0][j] = j;

下面来分析下题目规定的三个操作:添加,删除,替换。

假设word1[i]和word2[j](此处i = j)分别为:michaelab和michaelxy

显然如果b==y, 那么dis[i][j] = dis[i-1][j-1]。

如果b!=y,那么:

添加:也就是在michaelab后面添加一个y,那么word1就变成了michaelaby,此时

dis[i][j] = 1 + dis[i][j-1];

上式中,1代表刚刚的添加操作,添加操作后,word1变成michaelaby,word2为michaelxy。dis[i][j-1]代表从word[i]转换成word[j-1]的最小Edit Distance,也就是michaelab转换成michaelx的最小Edit Distance,由于两个字符串尾部的y==y,所以只需要将michaelab变成michaelx就可以了,而他们之间的最小Edit Distance就是dis[i][j-1]。

删除:也就是将michaelab后面的b删除,那么word1就变成了michaela,此时

dis[i][j] = 1 + dis[i-1][j];

上式中,1代表刚刚的删除操作,删除操作后,word1变成michaela,word2为michaelxy。dis[i-1][j]代表从word[i-1]转换成word[j]的最小Edit Distance,也就是michaela转换成michaelxy的最小Edit Distance,所以只需要将michaela变成michaelxy就可以了,而他们之间的最小Edit Distance就是dis[i-1][j]。

替换:也就是将michaelab后面的b替换成y,那么word1就变成了michaelay,此时

dis[i][j] = 1 + dis[i-1][j-1];

上式中,1代表刚刚的替换操作,替换操作后,word1变成michaelay,word2为michaelxy。dis[i-1][j-1]代表从word[i-1]转换成word[j-1]的最小Edit Distance,也即是michaelay转换成michaelxy的最小Edit Distance,由于两个字符串尾部的y==y,所以只需要将michaela变成michaelx就可以了,而他们之间的最小Edit Distance就是dis[i-1][j-1]。

最后只需要看着三种方案哪种最小,就采用哪种的编辑方案。

 

C++实现代码:

#include<iostream>
#include<string>
using namespace std;

class Solution {
public:
    int minDistance(string word1, string word2) {
        int m=word1.length();
        int n=word2.length();
        int edit[m+1][n+1];
        int i,j;
        for(i=0;i<=m;i++)
            edit[i][0]=i;
        for(j=0;j<=n;j++)
            edit[0][j]=j;
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(word1[i-1]==word2[j-1])
                    edit[i][j]=edit[i-1][j-1];
                else
                {
                    edit[i][j]=min(edit[i-1][j-1]+1,min(edit[i-1][j]+1,edit[i][j-1]+1));
                }
            }
        }
        return edit[m][n];
    }
};

int main()
{
    Solution s;
    string s1="eeba";
    string s2="abca";
    cout<<s.minDistance(s1,s2)<<endl;
}

 

时间: 2024-09-25 00:51:08

Edit Distance的相关文章

[LeetCode]72.Edit Distance

题目 Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: a) Insert a character b) Delete a character c) Re

使用Mongo Connector和Elasticsearch实现模糊匹配

[编者按]本篇博文作者Luke Lovett是MongoDB公司的Java工程师,他展示了Mongo Connector经过2年发展后的蜕变--完成连接器两端的同步更新.期间,Luke还展示如何通过Elasticsearch实现模糊匹配. 以下为译文: 介绍 假设你正在运行MongoDB.太好了,现在已经可以为基于数据库的所有查询进行精确匹配了.现在,设想你正要在你的应用中建立一个文本搜索功能,它必须去除拼写错误这个噪音,最终可能会得到一个相近的结果.为此,这个令人生畏的任务,你需要在Lucen

求一个字符串编辑成为另一个字符串的最少操作数

原题链接: http://oj.leetcode.com/problems/edit-distance/ 这道题求一个字符串编辑成为另一个字符串的最少操作数,操作包括添加,删除或者替换一个字符.这道题难度是比较大的,用常规思路出来的方法一般都是brute force,而且还不一定正确.这其实是一道二维动态规划的题目,模型上确实不容易看出来,下面我们来说说递推式. 我们维护的变量res[i][j]表示的是word1的前i个字符和word2的前j个字符编辑的最少操作数是多少.假设我们拥有res[i]

算法系列(四) 字符串的相似度

我们把两个字符串的相似度定义为:将一个字符串转换成另外一个字符串的代价(转换的方法可 能不唯一),转换的代价越高则说明两个字符串的相似度越低.比如两个字符串:"SNOWY"和 "SUNNY",下面给出两种将"SNOWY"转换成"SUNNY"的方法: 变换1:    S - N O W Y    S U N N - Y   Cost = 3 (插入U.替换O. 删除W) 变换2:    - S N O W - Y    S U

Ruby实现的最短编辑距离计算方法

  这篇文章主要介绍了Ruby实现的最短编辑距离计算方法,本文直接给出实现代码,需要的朋友可以参考下 利用动态规划算法,实现最短编辑距离的计算. 代码如下: #encoding: utf-8 #author: xu jin #date: Nov 12, 2012 #EditDistance #to find the minimum cost by using EditDistance algorithm #example output: # "Please input a string: &qu

KDD 2017 参会报告

本次参会报告由技术发展部黑屏:阿里云飞天一部杰铭.布晓.吴双:阿里妈妈产品技术部永叔.怀人:集团安全部裕宏等同学一起撰写.希望大家积极交流,踊跃发表看法. 一 背景:(杰铭) KDD的全称是ACM SIGKDD Conference on Knowledge Discovery and Data Mining.SIGKDD是ACM在数据挖掘领域的顶级学术会议,每年都吸引着超过2000位来自世界各地的顶级数据挖掘学者,以及知名企业代表前来参加.然而,大会的论文接收每年却仅约200篇,接收率不超过1

基于深度学习的智能问答

作者:周小强 陈清财 曾华军 1引言 纵观自动问答系统的技术发展历史,从1950年代因图灵测试而诞生至今,已经有几十年的历史.但真正在产业界得到大家的广泛关注,则得益于2011年Siri和Watson成功所带来的示范效应.自此,自动问答系统较以往任何时候都显得离实际应用更近.这一方面归功于机器学习与自然语言处理技术的长足进步,另一方面得益于维基百科等大规模知识库以及海量网络信息的出现.然而,现有的自动问答系统所面临的问题远没有完全解决.事实上,无论是业界应用还是学术研究,问句的真实意图分析.问句

JVM 并发性: Java 和 Scala 并发性基础

Java 并发性支持 在 Java 平台诞生之初,并发性支持就是它的一个特性,线程和同步的实现为它提供了超越其他竞争语言的优势.Scala 基于 Java 并在 JVM 上运行,能够直接访问所有 Java 运行时(包括所有并发性支持).所以在分析 Scala 特性之前,我首先会快速回顾一下 Java 语言已经提供的功能. Java 线程基础 在 Java 编程过程中创建和使用线程非常容易.它们由 java.lang.Thread 类表示,线程要执行的代码为 java.lang.Runnable 

Lucene5学习之SpellCheck拼写纠错

   最近有点累,让这篇又姗姗来迟了,各位不好意思,让你们久等了.趁着周末一个人没什么事,继续Lucene5系列的脚步,今天主题是Suggest模块下另一个功能:拼写纠错.什么叫拼写纠错?大家还是看图吧,这样会比较形象:          看完上面两张图片,我想大家应该已经知道SpellCheck是用来解决问题的了吧.其实这个功能主要目的还是为了提升用户体验问题,当用户输入的搜索关键字里包含了错别字(对于英文来说,就是单词拼写不正确),我们的搜索程序能智能检测出来并给出与用户输入的搜索关键字最相