动态规划---编辑距离
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)
(子问题间可能有重叠,不是相互独立的)
分治法-----把原问题分解为若干子问题------自顶向下解决子问题----合并子问题的解------得到原问题的解
(子问题之间均是独立)
算法要素: 最优子结构(问题的最优解包含其子问题的最优解)
解题秘籍: 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)
相关文章推荐
- 动态规划求编辑距离——算法解题报告
- 动态规划之编辑距离问题
- 动态规划求字符串之间的编辑距离
- 动态规划之编辑距离问题
- 动态规划:编辑距离和通配符匹配
- 动态规划之编辑距离(Edit Distance)
- 动态规划之编辑距离问题
- Java动态规划之编辑距离问题示例代码
- 动态规划问题学习路线:斐波那契数列,最大递增子序列,松鼠捡苹果,最大公共子序列,字符串编辑距离
- 动态规划——最短编辑距离
- 动态规划---最短编辑距离
- 编辑距离(动态规划经典)
- 动态规划之寻找编辑距离
- 经典动态规划—编辑距离,又称Levenshtein距离
- 动态规划 字符串编辑距离
- 动态规划求编辑距离——算法解题报告
- 动态规划之最长公共子序列和编辑距离
- 动态规划之编辑距离
- 动态规划-编辑距离问题
- poj 3356 AGTC(动态规划:最短编辑距离)