1.编辑距离的概念
2.动态规划思想
把原始问题划分成一系列子问题
求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时直接存取,不重复计算,节省计算时间
自底向上地计算
适用范围:
一类优化问题:可分为多个相关子问题,子问题的解被重复使用
使用动态规划的条件:
优化子结构
当一个问题的优化解包含了子问题的优化解时,我们说这个问题具有优化子结构。
缩小子问题集合,只需那些优化问题中包含的子问题,降低实现复杂性
优化子结构使得我们能自下而上地完成求解过程
重叠子问题
在问题的求解过程中,很多子问题的解将被多次使用
3.动态规划处理编辑距离
定理1(优化子结构)设X=(x1,..., xm)、Y=(y1, ..., yn) 是两个序列,Z=(z1,..., zk)是X与Y的LCS,我们有:
⑴如果xm=yn,则zk=xm=yn,Zk-1是Xm-1和Yn-1的LCS,即,LCSXY=LCSXm-1Yn-1+ <xm=yn>.
⑵如果xm¹yn,且zk¹xm,则Z是Xm-1和Y的LCS,即 LCSXY=LCSXm-1Y
⑶如果xm¹yn,且zk¹yn,则Z是X与Yn-1的LCS,即 LCSXY=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()]);
}
}