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);
}
}
编程之美--计算字符串的相似度
最新推荐文章于 2018-12-22 17:25:45 发布