您的位置:首页 > 其它

距离编辑算法

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: