距离编辑算法
2016-06-01 19:41
239 查看
java实现距离编辑算法,测试两个英文单词经最少次改变成为另一单词
import java.util.Scanner;
/**
*
* @author my
*距离编辑算法
*/
/**
*
* 伪代码:
* i from 0 to length of str1 +1
* matrix[0][i]=i
* j from 0 to length of str2 +1
* matrix[j][0]=j
*
* i from 1 to length of str1 +1
* j from 1 to length of str2 +1
* if str1[i]=str2[j]
* d =0
* else
* d =1
* matrix[i][j]=min(min(matrix[i][j-1]+1,matrix[i-1][j]+1),matrix[i-1][j-1]+d)
* print matrix
* return matrix[str1.length][str2.length]
*/
public class Levenshtein {
//找出两个数中最小数
public static int min(int firstNum,int secondNum){
return firstNum = firstNum<=
secondNum? firstNum:secondNum;
}
// i/o输入函数
public static void input(String firstStr,String secondStr){
System.out.println("输入两个字符串:");
Scanner in = new Scanner(System.in);
firstStr = in.next();
secondStr = in.next();
in.close();
}
//edit function to calculate distance
public static int edit(String firstStr,String secondStr,int[][]matrix){
//初始化
int len1 = firstStr.length()+1;
int len2 = secondStr.length()+1;
int i =0,j=0;
for(j=0;j<len1;j++){
matrix[j][0]=j;
}
for(i=0;i<len2;i++){
matrix[0][i]=i;
}
//填充matrix
for(i=1;i<len1;i++){
for(j=1;j<len2;j++){
int d = 0;
if(firstStr.charAt(i-1)!=secondStr.charAt(j-1))
d =1;
matrix[i][j]=min(min(matrix[i-1][j]+1,
matrix[i][j-1]+1),matrix[i-1][j-1]+d);
}
}
return matrix[len1-1][len2-1];
}
//打印函数
public static void print(int[][] matrix,int len1,int len2){
for(int i=0;i<len1;i++){
System.out.println();
for(int j=0;j<len2;j++){
System.out.print(" "+matrix[i][j]);
}
}
}
public static void main(String[] args){
String firstStr="";
String secondStr="";
System.out.println("输入两个字符串:");
Scanner in = new Scanner(System.in);
firstStr = in.next();
secondStr = in.next();
in.close();
int len1 = firstStr.length()+1;
int len2 = secondStr.length()+1;
int[][] matrix = new int[len1][len2];
int dis = edit(firstStr,secondStr,matrix);
print(matrix,len1,len2);
System.out.println();
System.out.println("distance: "+dis);
}
}
结果:
输入两个字符串:
setting gettin
0 1 2 3 4 5 6
1 1 2 3 4 5 6
2 2 1 2 3 4 5
3 3 2 1 2 3 4
4 4 3 2 1 2 3
5 5 4 3 2 1 2
6 6 5 4 3 2 1
7 6 6 5 4 3 2
distance: 2
import java.util.Scanner;
/**
*
* @author my
*距离编辑算法
*/
/**
*
* 伪代码:
* i from 0 to length of str1 +1
* matrix[0][i]=i
* j from 0 to length of str2 +1
* matrix[j][0]=j
*
* i from 1 to length of str1 +1
* j from 1 to length of str2 +1
* if str1[i]=str2[j]
* d =0
* else
* d =1
* matrix[i][j]=min(min(matrix[i][j-1]+1,matrix[i-1][j]+1),matrix[i-1][j-1]+d)
* print matrix
* return matrix[str1.length][str2.length]
*/
public class Levenshtein {
//找出两个数中最小数
public static int min(int firstNum,int secondNum){
return firstNum = firstNum<=
secondNum? firstNum:secondNum;
}
// i/o输入函数
public static void input(String firstStr,String secondStr){
System.out.println("输入两个字符串:");
Scanner in = new Scanner(System.in);
firstStr = in.next();
secondStr = in.next();
in.close();
}
//edit function to calculate distance
public static int edit(String firstStr,String secondStr,int[][]matrix){
//初始化
int len1 = firstStr.length()+1;
int len2 = secondStr.length()+1;
int i =0,j=0;
for(j=0;j<len1;j++){
matrix[j][0]=j;
}
for(i=0;i<len2;i++){
matrix[0][i]=i;
}
//填充matrix
for(i=1;i<len1;i++){
for(j=1;j<len2;j++){
int d = 0;
if(firstStr.charAt(i-1)!=secondStr.charAt(j-1))
d =1;
matrix[i][j]=min(min(matrix[i-1][j]+1,
matrix[i][j-1]+1),matrix[i-1][j-1]+d);
}
}
return matrix[len1-1][len2-1];
}
//打印函数
public static void print(int[][] matrix,int len1,int len2){
for(int i=0;i<len1;i++){
System.out.println();
for(int j=0;j<len2;j++){
System.out.print(" "+matrix[i][j]);
}
}
}
public static void main(String[] args){
String firstStr="";
String secondStr="";
System.out.println("输入两个字符串:");
Scanner in = new Scanner(System.in);
firstStr = in.next();
secondStr = in.next();
in.close();
int len1 = firstStr.length()+1;
int len2 = secondStr.length()+1;
int[][] matrix = new int[len1][len2];
int dis = edit(firstStr,secondStr,matrix);
print(matrix,len1,len2);
System.out.println();
System.out.println("distance: "+dis);
}
}
结果:
输入两个字符串:
setting gettin
0 1 2 3 4 5 6
1 1 2 3 4 5 6
2 2 1 2 3 4 5
3 3 2 1 2 3 4
4 4 3 2 1 2 3
5 5 4 3 2 1 2
6 6 5 4 3 2 1
7 6 6 5 4 3 2
distance: 2
相关文章推荐
- Java中instanceof关键字解析
- Android 缓存详解目录
- Web前端初学者,必知的7大HTML知识点
- 跟奥巴马一起编程
- poj2586——Y2K Accounting Bug(贪心)
- Android基于友盟的第三方登陆
- Fragment的添加和删除及其源码分析
- 【leetcode】Intersection of Two Arrays II
- ORACLE如何查看修改连接数,进程数及用户数,三者之间关系
- Codeforces Round #324 (Div. 2) B
- WPF中的数据绑定
- 一个ArrayList对象aList中存有若干个字符串元素,现欲遍历该ArrayList对象, 删除其中所有值为"abc"的字符串元素,请用代码实现。
- Windows 7 cmd PK Ubuntu 16.04 terminal
- 第十四周项目一-排序函数模版
- 无刷直流电机的性能与在采样泵上的运用
- Node.js 使用formidable上传文件及接受POST数据
- 20160601
- 微型真空气体采样泵气路的流导计算
- 微型真空气体采样泵的试验检测方法
- JS小数运算出现多位小数的问题