最小编辑距离

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

你总共三种操作方法:

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

样例

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

返回 3

解题

动态规划解题

定义矩阵dp[][]

dp[i][j] 表示word1前i个字符 [0,1,2,...,i-1] 和 word2前j个字符 [0,1,2,...,j-1]的编辑距离

ch1 = word1.charAt(i)

ch2 = word2.charAt(j)

当 ch1== ch2:word1[0--(i-1)] 与word2[0--(j-1)] 的编辑距离dp[i][j] = dp[i-1][j-1] 不需要修改

当ch1!=ch2: 有三种修改方式

  •       ch1替换word2中的ch2,此时的编辑距离受上一位的编辑距离影响, 编辑距离是:dp[i-1][j-1] + 1
  • ch2插入到word1中ch1的前面,word1中的ch2还没有比较,编辑距离是:dp[i-1][j] + 1
  • 删除ch2 编辑距离:dp[i][j-1] + 1

选取上面的最小值更新dp[i][j]的值

Java程序定义的dp矩阵长度是len1 + 1 * len2 + 1 的和上面有一点区别

import java.util.Scanner;
// write your code here
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
Main m = new Main();
while(in.hasNext()){
String[] str = in.nextLine().split(" ");
String word1 = str[0];
String word2 = str[1];
int min = m.minDistance(word1,word2);
System.out.println(min);
}
}
public int minDistance(String word1,String word2){
int len1 = word1.length();
int len2 = word2.length();
int[][] dp = new int[len1+1][len2+1];
for(int i =0;i<=len1;i++){
dp[i][0] = i;
}
for(int j =0;j<= len2;j++){
dp[0][j] = j;
}
for(int i =0;i< len1;i++){
char ch1 = word1.charAt(i);
for(int j =0;j< len2;j++){
char ch2 = word2.charAt(j);
if(ch1 == ch2){
dp[i+1][j+1] = dp[i][j];
}else{
int replace = dp[i][j] +1;// ch1 代替 ch2
int insert = dp[i][j+1] + 1;// ch2 插入到 ch1 前面的位置
int delete = dp[i+1][j] + 1;// 删除ch2
int min =replace>insert?insert:replace;
min = min>delete?delete:min;
dp[i+1][j+1] = min;
}
}
}
return dp[len1][len2];
}
}

注:搜狐2016实习笔试题目

lintcode:最小编辑距离的更多相关文章

  1. C#实现Levenshtein distance最小编辑距离算法

    Levenshtein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致.该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑 ...

  2. stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)

    I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...

  3. 自然语言处理(5)之Levenshtein最小编辑距离算法

    自然语言处理(5)之Levenshtein最小编辑距离算法 题记:之前在公司使用Levenshtein最小编辑距离算法来实现相似车牌的计算的特性开发,正好本节来总结下Levenshtein最小编辑距离 ...

  4. POJ 3356 AGTC(最小编辑距离)

    POJ 3356 AGTC(最小编辑距离) http://poj.org/problem?id=3356 题意: 给出两个字符串x 与 y,当中x的长度为n,y的长度为m,而且m>=n.然后y能 ...

  5. Minimum edit distance(levenshtein distance)(最小编辑距离)初探

    最小编辑距离的定义:编辑距离(Edit Distance),又称Levenshtein距离.是指两个字串之间,由一个转成还有一个所需的最少编辑操作次数.许可的编辑操作包含将一个字符替换成还有一个字符. ...

  6. 【NLP_Stanford课堂】最小编辑距离

    一.什么是最小编辑距离 最小编辑距离:是用以衡量两个字符串之间的相似度,是两个字符串之间的最小操作数,即从一个字符转换成另一个字符所需要的操作数,包括插入.删除和置换. 每个操作数的cost: 每个操 ...

  7. 牛客寒假算法基础集训营2 【处女座与复读机】DP最小编辑距离【模板题】

    链接:https://ac.nowcoder.com/acm/contest/327/G来源:牛客网 一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女 ...

  8. 最小编辑距离python

    1 什么是编辑距离在计算文本的相似性时,经常会用到编辑距离(Levenshtein距离),其指两个字符串之间,由一个字符串转成另一个所需的最少编辑操作次数.在字符串形式上来说,编辑距离越小,那么两个文 ...

  9. 通俗解析莱文斯坦距离(Levenshtein Distance)计算原理(最小编辑距离)

    [版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 最近看到一些动态规划的东西讲到莱文斯坦距离(编辑距离)的计算,发现很多都讲的 ...

随机推荐

  1. Question about pairing/bonding?

    Except that on android you can bypass the pairing dialog if you know the PIN in advance through a di ...

  2. Sliverlight Slide 的左右滑动

    private void btnPrev_Click(object sender, RoutedEventArgs e) { scrollRule = (scrollRule-) >= ?(sc ...

  3. ListBox mvvm 学习笔记

    1. ListBox  MvvM 例子1. 简单的绑定,ItemsSource 绑定到一个实现了IEnumerable 的类上.一般该绑定都是双向的,所以优先考虑使用 ObservableCollec ...

  4. gcc 创建库及使用

    gcc -shared hello.c -o libhello.so gcc -o test test.c -L库所在目录 -l库名

  5. Kinect帮助文档翻译之二 手势

    使用或创建手势 有两种方法可以将手势识别添加到你的unity项目中.第一种:找到KinectManager组件,在例子中它被附在MainCamera上.在组件中有两个列表的属性“Player1 Ges ...

  6. SQL Server 动态管理视图(DMVs)

    DMV在本地部署的SQL Server中需要VIEW SERVER STATE的权限   和事务有关的DMV sys.dm_tran_active_transactions:返回与您的当前逻辑数据库的 ...

  7. Posix线程编程指南(2) 线程私有数据

    概念及作用 在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据.在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有.但有时应用程序设计中有必要提供 ...

  8. javascript获取以及设置光标位置

    一. 获取光标位置: // 获取光标位置 function getCursortPosition (textDom) { var cursorPos = 0; if (document.selecti ...

  9. 【BZOJ】【1150】【CTSC2007】数据备份Backup

    堆/贪心 一共N-1个元素……用堆维护最大值,取了第x个元素以后,插入v[x-1]+v[x+1]-v[x]这个元素,如果再取这个新元素就表示不取x,而取x-1和x+1……大概就是这种“带反悔”的思路吧 ...

  10. 9 I/O复用

    I/O复用使得程序能够同时监听多个文件描述符,适用于以下情况: 客户端同时处理多个socket,比如非阻塞connect 客户端同时处理用户输入和网络连接,比如聊天室程序 TCP服务器同时处理监听so ...