编辑距离动态规划java_算法笔记1 - 编辑距离及其动态规划算法(Java代码)

编辑距离概念描述

编辑距离,又称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 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

(word1.charAt(i-1)==word2.charAt(j-1)?0:1);

edit_distance[i][j]=Math.min(d1,Math.min(d2,d3));

}

}returnedit_distance[word1.length()][word2.length()];

}

相关博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值