编辑距离及其动态规划算法(Java代码)
转载请标注原链接:http://www.cnblogs.com/xczyd/p/3808035.html
编辑距离概念描述
编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。一般情况下编辑操作包括:
- 将一个字符替换成另一个字符;
- 插入一个字符;
- 删除一个字符;
例如,将单词kitten转成单词sitting需要如下三个步骤:
- sitten (k→s)
- sittin (e→i)
- sitting (→g)
俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
编辑距离的应用在信息检索、拼写纠错、机器翻译、命名实体抽取、同义词寻找等问题中有较多的应用
问题定义
求出任意两个字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2。其中操作有三种,添加一个字符,删除一个字符,修改一个字符
问题解析
首先定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串A到第二个字符串的长度为j的子串B的编辑距离。
可以利用如下动态规划公式来解析问题:
- 若 i = 0 且 j = 0,那么 edit(i, j) = 0
- 若 i = 0 且 j > 0,那么 edit(i, j) = j
- 若 i > 0 且 j = 0,那么 edit(i, j) = i
- 若 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。
第1,2,3个公式理解起来都比较容易,第4个公式其实列出了字符串i向字符串j转变的三种方式(自左向右依次为在字符串A的末尾删除一个字符,在字符串A的末尾添加一个与字符串B的末尾相同的字符,将字符串A末尾的字符替换为字符串B末尾的字符),然后分别计算其编辑距离,最后取其中的最小值。
Java代码
由上述动态规划公式,可以编写编辑距离的Java代码如下:
public int minDistance(String word1, String word2) {
//若两个字符串都为空时,编辑距离为0
if((word1==null||word1.length()==0)&&(word2==null||word2.length()==0)){
return 0;
}
//若其中一个字符串为空时,编辑距离为另一个字符串的长度
if(word1==null||word1.length()==0){
return word2.length();
}
if(word2==null||word2.length()==0){
return word1.length();
}
//建立二维数组来保存所有的edit(i,j)
int[][] edit_distance = new int[word1.length()+1][word2.length()+1];
for(int i=0;i<word1.length()+1;i++){
edit_distance[i][0] = i;
}
for(int j=0;j<word2.length()+1;j++){
edit_distance[0][j] = j;
}
//套入动态规划公式
for(int i=1;i<word1.length()+1;i++){
for(int j=1;j<word2.length()+1;j++){
int d1 = edit_distance[i-1][j]+1;
int d2 = edit_distance[i][j-1]+1;
int d3 = edit_distance[i-1][j-1]+
(word1.charAt(i-1)==word2.charAt(j-1)?0:1);
edit_distance[i][j] = Math.min(d1,Math.min(d2,d3));
}
}
return edit_distance[word1.length()][word2.length()];
}
相关博客
http://www.cnblogs.com/biyeymyhjob/archive/2012/09/28/2707343.html 有注解有图写的相当好
http://www.cnblogs.com/pandora/archive/2009/12/20/levenshtein_distance.html
编辑距离及其动态规划算法(Java代码)的更多相关文章
- 算法笔记1 - 编辑距离及其动态规划算法(Java代码)
转载请标注原链接:http://www.cnblogs.com/xczyd/p/3808035.html 编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个 ...
- 动态规划算法(java)
一.动态规划算法 众所周知,递归算法时间复杂度很高为(2^n),而动态规划算法也能够解决此类问题,动态规划的算法的时间复杂度为(n^2).动态规划算法是以空间置换时间的解决方式,一开始理解起来可能比较 ...
- 排序算法Java代码实现(一)—— 选择排序
以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...
- 算法-java代码实现基数排序
基数排序 第11节 基数排序练习题 对于一个int数组,请编写一个基数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组.保证元素均小于等于2000. 测试样例: [1 ...
- 算法-java代码实现计数排序
计数排序 第10节 计数排序练习题 对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3], ...
- 算法-java代码实现希尔排序
希尔排序 第8节 希尔排序练习题 对于一个int数组,请编写一个希尔排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组.保证元素小于等于2000. 测试样例: [1,2 ...
- 算法-java代码实现堆排序
堆排序 第7节 堆排序练习题 对于一个int数组,请编写一个堆排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2 ...
- 算法-java代码实现快速排序
快速排序 对于一个int数组,请编写一个快速排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] ...
- 算法-java代码实现归并排序
归并排序 对于一个int数组,请编写一个归并排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] ...
随机推荐
- spark 1.5.2配置记录
1)slaves # A Spark Worker will be started on each of the machines listed below. dataNode 2)spark-env ...
- ${mapred.local.dir}选择策略--Map Task存放中间结果
上篇说了block在DataNode配置有多个${dfs.data.dir}时的存储策略,本文主要介绍TaskTracker在配置有多个${mapred.local.dir}时的选择策略. mapre ...
- μC/OS-Ⅲ系统的时间管理函数和定时器
一.时间管理函数 μC/OS-Ⅲ系统提供一些列时间管理服务函数: 1.OSTimeDly():任务延时n个时钟节拍. 2.OSTimeDlyHMSM():任务延时指定的时间,采用“时:分:秒:毫秒”方 ...
- Bootstrap<基础一> CSS 概览
HTML 5 文档类型(Doctype) Bootstrap 使用了一些 HTML5 元素和 CSS 属性.为了让这些正常工作,您需要使用 HTML5 文档类型(Doctype). 因此,请在使用 B ...
- 关于springMVC3.0基于注解方式的项目搭建
前言:开发了几个月的AS3项目,感觉JAVA都用不太熟练了.刚好这几个抽的空,就把自己以前用过的Spring框架再搭一边, 并完整的记录下来 开发环境:tomcat + mysql+ java 1.所 ...
- Hollister Outlet Store
(link to hollisterco site), It's a major try. After a photographer's viewpoint, Which roughly splend ...
- IOS setValue forKey
NSObjiect *obj:[obj setValue:value forKey:@"cpname"]复制代码的时候都会出现这个异常this class is not key v ...
- CSS之transition过渡练习
代码: <!DOCTYPE html><html><head> <title>transition</title> <meta cha ...
- a链接的四种状态
四种状态:hover.link.active.visible a:link{color:#fff;} a链接初始化 a:hover{color:yellow;} 把鼠标放上去的状况 a:active{ ...
- Android AsyncTask异步任务(二)
之前我们讲过了AsyncTask 的生命周期(onPreExecute-->doInBackground-->onProgressUpdate-->onPostExecute),今天 ...