编辑距离
来源:互联网 发布:js中的event对象 编辑:程序博客网 时间:2024/05/01 22:04
问题:
给定两个字符串 A和B,由A转成B所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将A(kitten)转成B(sitting):
sitten (k→s)替换
sittin (e→i)替换
sitting (→g)插入
思路:
如果我们用 i 表示当前字符串 A 的下标,j 表示当前字符串 B 的下标。 如果我们用d[i, j] 来表示A[1, ... , i] B[1, ... , j] 之间的最少编辑操作数。那么我们会有以下发现:
1. d[0, j] = j;
2. d[i, 0] = i;
3. d[i, j] = d[i-1, j - 1] if A[i] == B[j]
4. d[i, j] = min(d[i-1, j - 1], d[i, j - 1], d[i-1, j]) + 1 if A[i] != B[j]
所以,要找出最小编辑操作数,只需要从底自上判断就可以了。伪代码如下:
- int LevenshteinDistance(char s[1..m], char t[1..n])
- {
- // for all i and j, d[i,j] will hold the Levenshtein distance between
- // the first i characters of s and the first j characters of t;
- // note that d has (m+1)x(n+1) values
- declare int d[0..m, 0..n]
- for i from 0 to m
- d[i, 0] := i // the distance of any first string to an empty second string
- for j from 0 to n
- d[0, j] := j // the distance of any second string to an empty first string
- for j from 1 to n
- {
- for i from 1 to m
- {
- if s[i] = t[j] then
- d[i, j] := d[i-1, j-1] // no operation required
- else
- d[i, j] := minimum
- (
- d[i-1, j] + 1, // a deletion
- d[i, j-1] + 1, // an insertion
- d[i-1, j-1] + 1 // a substitution
- )
- }
- }
- return d[m,n]
- }
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 计算机科学发展的动力
- POI设置EXCEL单元格格式为文本、小数、百分比、货币、日期、科学计数法和中文大写
- 在 Visual C++ 开发环境下使用ADO来进行数据库应用程序开发
- 天外飞仙之时效爱情
- ruby 正则 $& 和 $'
- 编辑距离
- 14岁初中生—— 踏踏实实的人生也最美
- Linux系统32位与64位GCC编译器基本数据类型长度对照表
- hdu1142 A Walk Through the Forest
- 香港版雙飛人藥水和內地版的區別
- 排序算法1—插入排序、选择排序、冒泡排序
- linux下查看文件编码及修改编码
- poj 2154 Color
- 如何成为顶尖WordPress开发者