编程之美--计算字符串的相似度

package structure;

/**
 * 计算字符串的相似度:对于两个不同的字符串,转成相同的字符串要几步(t) 1/(t+1)就是要求的字符串的相似度
 * 
 * 
 * 思路:如果a[i] == b[j] 则继续计算 a[i+1] b [j+1]
 * 如果 a[i] != b[j]  我们可以采取以下的措施
 * 	1.添加
 * 		1.将 b[j] 添加到 a 中,继续判断a[i,end],b[j+1,end]
 * 		2.将 a[i] 添加到 b 中,继续判断a[i+1,end],b[j,end]
 * 	2.删除
 * 		1.将 b[i]删除,继续判断a[i,end] b[j+1,end]
 * 		2.将 a[i]删除,继续判断a[i+1,end],b[j,end]
 * 	3.修改
 * 		1.将 a[i] 修改成 b[j]的值,继续判断 a[i+1],b[j+1]
 * 		2.将 b[j] 修改成a[i] 的值,继续判断a[i+1],b[j+1]的值
 * 
 * 	所以总结以上六种情况,也就三种情况 
 * 		a[i,end],b[j+1,end]+1
 * 		a[i+1,end] b[j,end]+1
 * 		a[i+1,end] b[j+1,end]+1
 * 	求这三种情况的最小值,最后的加1可以直接放到最小值上再进行
 * 
 */
public class CalculateStringDistance {

    static int execute(String a, int afrom, int ato, String b, int bfrom,
	    int bto) {
	if (afrom >= ato) {
	    if (bfrom > bto)
		return 0;
	    else
		return bto - bfrom;
	}
	if (bfrom >= bto) {
	    if (afrom > ato)
		return 0;
	    else
		return ato - afrom;
	}
	if(a.charAt(afrom) == b.charAt(bfrom))
	    return execute(a,afrom+1,ato,b,bfrom+1,bto);
	else {
	    int  t1 = execute(a,afrom+1,ato,b,bfrom+1,bto);
	    int t2 = execute(a,afrom+1,ato,b,bfrom,bto);
	    int t3 = execute(a,afrom,ato,b,bfrom+1,bto);
	    return Math.min(Math.min(t1, t2),Math.min(t2, t3))+1;
	}
    }
    public static void main(String args[]){
	String a = "xabcdae";
	String b = "xfdfa";
	int t  = execute(a,0,a.length(),b,0,b.length());
	System.out.println(t);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值