编辑距离

距离:

插入:1

删除:1

替换:2,(1也行,改下代码变2为1)

#include <iostream>
using namespace std;

const int N = 100;
int d[N][N];
char s1[N], s2[N];

int min_edit_distance(const char* a, const char* b,
    int len_a, int len_b)
{
    int i,j,d1,d2,d3;
    
    d[0][0] = 0;
    for(int i=1; i<=len_a; i++)
        d[i][0] = i;
    for(int i=1; i<=len_b; i++)
        d[0][i] = i;
    
    for(i=1; i<=len_a; i++)
    {
        for(j=1; j<=len_b; j++)
        {
            d1 = d[i-1][j]+1;
            d2 = d[i][j-1]+1;
            d3 = d[i-1][j-1]+((a[i-1] == b[j-1])?0:2);
            d[i][j] = min(min(d1,d2),d3);
        }
    }
}

int main()
{
    int len_a=1, len_b;
    while(true)
    {
        cin>>s1;
        if(!strcmp(s1,"quit"))
            break;
        cin>>s2;
        len_a = strlen(s1);
        len_b = strlen(s2);
        min_edit_distance(s1, s2, len_a, len_b);
        cout<<d[len_a][len_b]<<endl;
    }
    
    return 0;
}


Java代码,顺便把修改规则和最终的字符串打印出来。注意变化后的字符串并不唯一,增删改操作不同,对应的字符串不同。

public class 编辑距离 {
	
	static int func(char a[], char b[]){
		
		int lenA = a.length;
		int lenB = b.length;
		
		int t[][] = new int[lenA+1][lenB+1];
		int i, j;
		
		int m[][] = new int[lenA+1][lenB+1];
		
		for(i=0; i<=lenA; i++)t[i][0] = i;
		for(i=0; i<=lenB; i++)t[0][i] = i;
		
		for(i=1; i<=lenA; i++){
			for(j=1; j<=lenB; j++){
				t[i][j] = Math.min(Math.min(t[i-1][j]+1, t[i][j-1]+1), 
						t[i-1][j-1] + (a[i-1] == b[j-1] ? 0 : 1));
				
				//记录修改规则
				if(t[i][j] == t[i-1][j]+1){
					m[i][j] = 1;
				}else if(t[i][j] == t[i][j-1]+1){
					m[i][j] = 2;
				}else{
					m[i][j] = 3;
				}
			}
		}
		
		//根据修改规则进行修改
		for(i=lenA, j=lenB; i>0 && j>0;){
			if(m[i][j] == 1){
				System.out.printf("Delete: A[%d](%c)\n", i-1, a[i-1]);
				a[i-1] = 0;
				i--;
			}else if(m[i][j] == 2){
				System.out.printf("Delete: B[%d](%c)\n", j-1, b[j-1]);
				b[j-1] = 0;
				j--;
			}else if(m[i][j] == 3){
				if(a[i-1] != b[j-1]){
					System.out.printf("Change: A[%d](%c) To B[%d](%c)\n", i-1, a[i-1], 
							j-1, b[j-1]);
					a[i-1] = b[j-1];
				}
				i--;
				j--;
			}
		}
		
		//将修改后的串a、b打印出来,检查是否一样
		for(i=0; i<lenA; i++){
			if(a[i] != 0){
				System.out.print(a[i]);
			}
		}
		System.out.println();
		
		for(i=0; i<lenB; i++){
			if(b[i] != 0){
				System.out.print(b[i]);
			}
		}
		System.out.println();
		
		return t[lenA][lenB];
	}
	
	public static void main(String[] args) {
		System.out.println(func("a2bcaludtjdfghsdhryjaeagebsnmtdjssdfasdf".toCharArray(), 
				"abcbcanbmkshaegadgrtjasrgweetrsbdfsdfdsf".toCharArray()));
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值