动态规划求字符串之间的编辑距离

1.编辑距离的概念

   编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。
   例如site和ste两个字符串的编辑距离是1
   site->ste(删除i)
   ste->site(插入i)

2.动态规划思想

       动态规划的特点:

把原始问题划分成一系列子问题

求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时直接存取,不重复计算,节省计算时间

自底向上地计算

适用范围:

一类优化问题:可分为多个相关子问题,子问题的解被重复使用

使用动态规划的条件:

优化子结构

当一个问题的优化解包含了子问题的优化解时,我们说这个问题具有优化子结构。

缩小子问题集合,只需那些优化问题中包含的子问题,降低实现复杂性

优化子结构使得我们能自下而上地完成求解过程

重叠子问题

在问题的求解过程中,很多子问题的解将被多次使用

3.动态规划处理编辑距离

其实与最长公共子序列的想法是一样的。
•优化子结构

定理1(优化子结构)X=(x1,..., xm)Y=(y1, ..., yn) 是两个序列,Z=(z1,..., zk)XYLCS,我们有

 如果xm=yn,zk=xm=yn,Zk-1Xm-1Yn-1LCS即,LCSXY=LCSXm-1Yn-1+ <xm=yn>.

 如果xm¹ynzk¹xmZXm-1YLCSLCSXY=LCSXm-1Y

 如果xm¹yn,zk¹yn,ZXYn-1LCSLCSXY=LCSXYn-1

•递归方程

 C[i,j] = j                                    if  i=0

C[i,j] = i                                   if  j=0

 C[i,j] = C[i-1, j-1]             if i,j>0 xi =yj

 C[i,j] = Min(C[i,j-1], C[i-1, j],C[i-1, j-1]) +1  ifi,j>0 xi != yj

4.java代码实现

package com.edu.hit;

import java.util.Scanner;

public class EditDistance {

	public static void main(String[] args) {
		String str1,str2;
		Scanner in = new Scanner(System.in);
		str1 = in.next();
		str2 = in.next();
		int[][] cal = new int[str1.length()+1][str2.length()+1];
		//初始化
		for (int i = 0; i < str2.length()+1; i++) {
			cal[0][i] = i;
		}
		for (int i = 0; i < str1.length()+1; i++) {
			cal[i][0] = i;
		}
		//char[] str3 = str1.toCharArray();
		//char[] str4 = str2.toCharArray();
		//根据递归方程自底向上计算
		for (int i = 1; i < str1.length()+1; i++) {
			for (int j = 1; j < str2.length()+1; j++) {
				if(str1.charAt(i-1) == str2.charAt(j-1)){
					cal[i][j] = cal[i-1][j-1];
				}else{
					cal[i][j] = Math.min(Math.min(cal[i-1][j-1], cal[i-1][j]), cal[i][j-1])+1;
				}
			}
		}
		System.out.println(cal[str1.length()][str2.length()]);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值