您的位置:首页 > 其它

动态规划---编辑距离

2018-03-18 20:42 141 查看
动态规划---把原问题分解为若干子问题 ----自底向上---求解最小子问题(结果储存在表格中)----求解大的子问题
(子问题间可能有重叠,不是相互独立的)
分治法-----把原问题分解为若干子问题------自顶向下解决子问题----合并子问题的解------得到原问题的解
(子问题之间均是独立)

算法要素:   最优子结构(问题的最优解包含其子问题的最优解)
解题秘籍: 1 分析最优解的结构特征
                  2  建立最优值的递归式
                  3 自底向上计算最优值  并记录
                  4  构造最优解

package com.duoduo.day316;
/**
* 编辑距离
* 两个字符串:将一个字符串变换为另一个字符串所需要的最小编辑操作;
* 3种对齐方式: 删除 -----插入-----替换
* @author 多多
*
*/
import java.util.Scanner;
public class Test4_4_1 {
public static void main(String [] args) {
Scanner sc=new Scanner(System.in);
System.out.println("输入字符串str1:");
String str1=sc.next();
System.out.println("输入字符串str2:");
String str2=sc.next();
System.out.println("str1和str2的编辑距离是:"+editDistance(str1,str2));
}
/*编辑距离*/
public static int editDistance(String str1,String str2) {
int len1=str1.length();
int len2=str2.length();
int [] [] d=new int [len1+1][len2+1]; //新建记录编辑距离的数组
//初始化距离数组
for(int i=0;i<=len1;i++)
d[i][0]=i;
for(int j=0;j<len2;j++)
d[0][j]=j;

//循环比较字符串
for(int i=1;i<=len1;i++) {
for(int j=1;j<=len2;j++) {
int diff=0;
if(str1.charAt(i-1)==str2.charAt(j-1)) { //相等则距离不变
diff=0;
}else //不等则距离+1
diff=1;
int temp=min(d[i-1][j]+1,d[i][j-1]+1); //先两者取小值
d[i][j]=min(d[i-1][j-1]+diff,temp); //再取最小值
}
}
return d[len1][len2]; //返回最终的编辑距离
}
private static int min(int i, int j) {
return i>j?j:i;
}
}



时间复杂度: 两个for 循环 双重for 循环 O(m*n)  m,n为字符串长度
空间复杂度:辅助数组 d O(m*n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: