编辑距离概念描述:
编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
sitten (k→s)
sittin (e→i)
sitting (→g)
俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
编辑距离的应用在信息检索、拼写纠错、机器翻译、命名实体抽取、同义词寻找等问题中有较多的应用
问题:找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2,操作有三种,添加一个字符,删除一个字符,修改一个字符
解析:
首先定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。
可以利用如下动态规划公式来解析问题:
(1)若 i = 0 且 j = 0,edit(i, j) = 0
(2)若 i = 0 且 j > 0,edit(i, j) = j
(3)若 i > 0 且 j = 0,edit(i, j) = i
(4)若 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。
由此可以编写编辑距离的动态规划算法的Java代码如下:
public intminDistance(String word1, String word2) {//若两个字符串都为空时,编辑距离为0
if((word1==null||word1.length()==0)&&(word2==null||word2.length()==0)){return 0;
}//若其中一个字符串为空时,编辑距离为另一个字符串的长度
if(word1==null||word1.length()==0){returnword2.length();
}if(word2==null||word2.length()==0){returnword1.length();
}//建立维数组来保存所有的edit(i,j)
int[][] edit_distance = new int[word1.length()+1][word2.length()+1];for(int i=0;i
edit_distance[i][0] =i;
}for(int j=0;j
edit_distance[0][j] =j;
}//套入动态规划公式
for(int i=1;i
edit_distance[i][j]=Math.min(d1,Math.min(d2,d3));
}
}returnedit_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
原文:http://www.cnblogs.com/xczyd/p/3808035.html