字符串相似度算法

public   class  Levenshtein {
    
    
private   int  compare(String str, String target) {
        
int  d[][];  //  矩阵
         int  n  =  str.length();
        
int  m  =  target.length();
        
int  i;  //  遍历str的
         int  j;  //  遍历target的
         char  ch1;  //  str的
         char  ch2;  //  target的
         int  temp;  //  记录相同字符,在某个矩阵位置值的增量,不是0就是1
        
        
if  (n  ==   0 ) {
            
return  m;
        }
        
        
if  (m  ==   0 ) {
            
return  n;
        }
        
        d 
=   new   int [n  +   1 ][m  +   1 ];
        
        
for  (i  =   0 ; i  <=  n; i ++ ) {  //  初始化第一列
            d[i][ 0 =  i;
        }
        
        
for  (j  =   0 ; j  <=  m; j ++ ) {  //  初始化第一行
            d[ 0 ][j]  =  j;
        }
        
        
for  (i  =   1 ; i  <=  n; i ++ ) {  //  遍历str
            ch1  =  str.charAt(i  -   1 );
            
//  去匹配target
             for  (j  =   1 ; j  <=  m; j ++ ) {
                ch2 
=  target.charAt(j  -   1 );
                
if  (ch1  ==  ch2) {
                    temp 
=   0 ;
                } 
else  {
                    temp 
=   1 ;
                }
                
                
//  左边+1,上边+1, 左上角+temp取最小
                d[i][j]  =  min(d[i  -   1 ][j]  +   1 , d[i][j  -   1 +   1 , d[i  -   1 ][j  -   1 +  temp);
            }
        }
        
        
return  d[n][m];
    }
    
    
private   int  min( int  one,  int  two,  int  three) {
        
return  (one  =  one  <  two  ?  one : two)  <  three  ?  one : three;
    }
    
    
/**
     * 获取两字符串的相似度
     * 
     * 
@param  str
     * 
@param  target
     * 
     * 
@return
     
*/
    
    
public   float  getSimilarityRatio(String str, String target) {
        
return   1   -  ( float ) compare(str, target)  /  Math.max(str.length(), target.length());
        
    }
    
    
public   static   void  main(String[] args) {
        Levenshtein lt 
=   new  Levenshtein();
        String str 
=   " ab " ;
        String target 
=   " ac " ;
        System.out.println(
" similarityRatio= "   +  lt.getSimilarityRatio(str, target));
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值