3个版本的计算字符串的相似度. js C# java

Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。
许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。

计算字符串的相似度. javascript版

/** 
    *  
    * 检查两个字符串的相似度
    * 可以用在 DNA分析   拼字检查   语音辨识   抄袭侦测 
    * @createTime 2012-1-12 
    */
function Levenshtein(str1, str2) {
    //计算两个字符串的长度。  
    var len1 = str1.length;
    var len2 = str2.length;
    //建立上面说的数组,比字符长度大一个空间  
    var dif = [];

    //赋初值,步骤B。  
    for (var a = 0; a <= len1; a++) {
        dif[a] = [];
        dif[a][0] = a;
    }
    for (var a = 0; a <= len2; a++) {
        dif[0][a] = a;
    }
    //计算两个字符是否一样,计算左上的值  
    var temp;
    for (var i = 1; i <= len1; i++) {
        for (var j = 1; j <= len2; j++) {
            if (str1[i - 1] == str2[j - 1]) {
                temp = 0;
            } else {
                temp = 1;
            }
            //取三个值中最小的  
            dif[i][j] = min([
                            dif[i - 1][j - 1] + temp,
                            dif[i][j - 1] + 1,
                            dif[i - 1][j] + 1
            ]);
        }
    }
    //System.out.println("字符串\""+str1+"\"与\""+str2+"\"的比较");  
    //取数组右下角的值,同样不同位置代表不同字符串的比较  
    console.log("差异步骤:" + dif[len1][len2]);

    //计算相似度 
    var similarity = 1 - dif[len1][len2] / Math.max(str1.length, str2.length);
    debugger
    //System.out.println("相似度:"+similarity);
    return similarity;

}

//得到最小值  
function min(ints) {
    var min = 0;
    for (var i = 0; i < ints.length; i++) {
        if (min > ints[i]) {
            min = ints[i];
        }
    }
    return min;
}

**

计算字符串的相似度. java 版

**

package code;  

/** 
 * @className:MyLevenshtein.java 
 * @classDescription:Levenshtein Distance 算法实现 
 * 可以使用的地方:DNA分析   拼字检查   语音辨识   抄袭侦测 
 * @author:donghai.wan 
 * @createTime:2012-1-12 
 */  
public class MyLevenshtein {  

    public static void main(String[] args) {  
        //要比较的两个字符串  
        String str1 = "今天星期四";  
        String str2 = "今天是星期五";  
        levenshtein(str1,str2);  
    }  

    /** 
     *   DNA分析   拼字检查   语音辨识   抄袭侦测 
     *  
     * @createTime 2012-1-12 
     */  
    public static void levenshtein(String str1,String str2) {  
        //计算两个字符串的长度。  
        int len1 = str1.length();  
        int len2 = str2.length();  
        //建立上面说的数组,比字符长度大一个空间  
        int[][] dif = new int[len1 + 1][len2 + 1];  
        //赋初值,步骤B。  
        for (int a = 0; a <= len1; a++) {  
            dif[a][0] = a;  
        }  
        for (int a = 0; a <= len2; a++) {  
            dif[0][a] = a;  
        }  
        //计算两个字符是否一样,计算左上的值  
        int temp;  
        for (int i = 1; i <= len1; i++) {  
            for (int j = 1; j <= len2; j++) {  
                if (str1.charAt(i - 1) == str2.charAt(j - 1)) {  
                    temp = 0;  
                } else {  
                    temp = 1;  
                }  
                //取三个值中最小的  
                dif[i][j] = min(dif[i - 1][j - 1] + temp, dif[i][j - 1] + 1,  
                        dif[i - 1][j] + 1);  
            }  
        }  
        System.out.println("字符串\""+str1+"\"与\""+str2+"\"的比较");  
        //取数组右下角的值,同样不同位置代表不同字符串的比较  
        System.out.println("差异步骤:"+dif[len1][len2]);  
        //计算相似度  
        float similarity =1 - (float) dif[len1][len2] / Math.max(str1.length(), str2.length());  
        System.out.println("相似度:"+similarity);  
    }  

    //得到最小值  
    private static int min(int... is) {  
        int min = Integer.MAX_VALUE;  
        for (int i : is) {  
            if (min > i) {  
                min = i;  
            }  
        }  
        return min;  
    }  

}  

**

计算字符串的相似度. C# 版

**

 /** 
     *  
     * 检查两个字符串的相似度
     * 可以用在 DNA分析   拼字检查   语音辨识   抄袭侦测 
     * @createTime 2012-1-12 
     */  
    public static float  Levenshtein(string str1,string str2) {  
        //计算两个字符串的长度。  
        int len1 = str1.Length;  
        int len2 = str2.Length;  
        //建立上面说的数组,比字符长度大一个空间  
        int[][] dif = new int[len1 + 1][];
        //初始化二维数组
        for (int i = 0; i < dif.Length; i++)
        {
            dif[i] = new int[len2 + 1];
        }

        //赋初值,步骤B。  
        for (int a = 0; a <= len1; a++) {  
            dif[a][0] = a;  
        }  
        for (int a = 0; a <= len2; a++) {  
            dif[0][a] = a;  
        }  
        //计算两个字符是否一样,计算左上的值  
        int temp;  
        for (int i = 1; i <= len1; i++) {  
            for (int j = 1; j <= len2; j++) {  
                if (str1[i - 1] == str2[j - 1]) {  
                    temp = 0;  
                } else {  
                    temp = 1;  
                }  
                //取三个值中最小的  
                dif[i][j] = min(new int[]{
                                            dif[i - 1][j - 1] + temp, 
                                            dif[i][j - 1] + 1,  
                                            dif[i - 1][j] + 1
                                        }
                                );  
            }  
        }  
        //System.out.println("字符串\""+str1+"\"与\""+str2+"\"的比较");  
        //取数组右下角的值,同样不同位置代表不同字符串的比较  
        //System.out.println("差异步骤:"+dif[len1][len2]);  
        //计算相似度  
        float similarity =1 - (float) dif[len1][len2] / Math.Max(str1.Length, str2.Length);  
        //System.out.println("相似度:"+similarity);
        return similarity;

    }

    //得到最小值  
    private static int min(int[] ints) {  
        int min = int.MaxValue;
        for (int i = 0; i < ints.Length; i++)
        {
            if (min > ints[i]) {  
                min = ints[i];  
            }  
        } 
        return min;  
    }  
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以通过编写Levenshtein Distance算法来计算字符串相似度。以下是一个基于动态规划的实现示例代码: ```java public class LevenshteinDistance { public static int calculate(String s1, String s2) { int[][] distance = new int[s1.length() + 1][s2.length() + 1]; for (int i = 0; i <= s1.length(); i++) { distance[i][0] = i; } for (int j = 1; j <= s2.length(); j++) { distance[0][j] = j; } for (int i = 1; i <= s1.length(); i++) { for (int j = 1; j <= s2.length(); j++) { int cost = s1.charAt(i - 1) == s2.charAt(j - 1) ? 0 : 1; distance[i][j] = Math.min(Math.min(distance[i - 1][j] + 1, distance[i][j - 1] + 1), distance[i - 1][j - 1] + cost); } } return distance[s1.length()][s2.length()]; } } ``` 在上述代码中,我们首先定义一个二维数组distance,用于存储字符串s1和s2之间的编辑距离。然后,我们初始化distance数组的第一行和第一列。接着,我们通过两个嵌套的循环遍历distance数组,计算编辑距离。最后,我们返回distance数组的最后一个元素,即s1和s2之间的编辑距离。 可以通过以下方式调用LevenshteinDistance类中的calculate方法来计算两个字符串之间的编辑距离: ```java String s1 = "kitten"; String s2 = "sitting"; int distance = LevenshteinDistance.calculate(s1, s2); System.out.println("编辑距离为:" + distance); ``` 运行结果为: ``` 编辑距离为:3 ``` 这表明,将字符串"kitten"转变成字符串"sitting"所需的最少操作次数为3。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值