编辑距离算法的实现

        编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个 字符 替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。
例如将kitten一字转成sitting:
sitten (k→s)
sittin (e→i)
sitting (→g)
比如要计算cafe和coffee的编辑距离。cafe→caffe→coffe→coffee
先创建一个6×8的表(cafe长度为4,coffee长度为6,各加2)
(1):
  coffee
        
c       
a       
f       
e     1
接着,在如下位置填入数字(表2):
  coffee
 0123456
c1      
a2      
f3      
e4    2
从3,3格开始,开始计算。取以下三个值的最小值:
  • 如果最上方的字符等于最左方的字符,则为左上方的数字。否则为左上方的数字+1。(对于3,3来说为0)
  • 左方数字+1(对于3,3格来说为2)
  • 上方数字+1(对于3,3格来说为2)
因此为格3,3为0(表3)
  coffee
 0123456
c1
  0
     
a2      
f3      
e4    3
  
循环操作,推出下表
  coffee
 0123456
c1012345
a2112345
f3221234
e4332223
取右下角,得编辑距离为3
代码实现如下:
import java.util.Scanner;
import java.util.regex.Pattern;

public class Test{
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		String s1=input.nextLine();
		String s2=input.nextLine();
		compare(s1,s2);
		input.close();
	}
	
	public static void compare(String s1,String s2){
		int m=s1.length();
		int n=s2.length();
		int c[][]=new int[m+1][n+1];
		for(int i=0;i<m+1;i++){
			c[0][i]=i;
		}
		for(int j=0;j<n+1;j++){
			c[j][0]=j;
		}
		for(int i=1;i<m+1;i++){
			for(int j=1;j<n+1;j++){
				if(s1.charAt(i-1)==s2.charAt(j-1)){
					c[i][j]=min(c[i-1][j]+1,c[i][j-1]+1,c[i-1][j-1]);
				}else{
					c[i][j]=min(c[i-1][j]+1,c[i][j-1]+1,c[i-1][j-1]+1);
				}
			}
		}
		System.out.println("****");
		for(int i=0;i<m+1;i++){
			for(int j=0;j<n+1;j++){
				System.out.print(c[i][j]+" ");
			}
			System.out.println("");
		}
		System.out.println("****");
	}
	
	public static int min(int a,int b,int c){
		return a<b?(a<c?a:c):(b>c?c:b);
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值