计算字符串的距离

本文介绍了如何使用Levenshtein距离算法计算两个字符串之间的转换操作数,通过Java代码实例展示了如何在主函数中输入多组字符串并计算它们的相似度。算法核心在于动态规划,通过最小化插入、删除和替换操作来找到最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        //防止有循环输入
        while(s.hasNext()){
            String A = s.nextLine();
            String B = s.nextLine();
            int num = Levenshtein(A,B);
            System.out.println(num);
        }
    }
     public static int Levenshtein(String A , String B){
         char[] a = A.toCharArray();
         char[] b = B.toCharArray();
         int la = a.length;
         int lb = b.length;
         //简历一个二位数组 大小为 [la+1][lb+1] 因为动规需要用到前一位的状态 所以多给一位用来写第一个数据的前一位
         int[][] ints = new int[la+1][lb+1];
         //动规一般都需要初始化边界  下面分别是二维数组的两个边界 上面的表示i个字符转化为0个字符需要i步删除操作  下面的是表示0个字符转化为i个字符 需要i步插入操作
         for(int i = 0; i <= la; i++){
             ints[i][0] = i;
         }
         for(int i = 0; i <= lb; i++){
             ints[0][i] = i;
         }
         //下面记录除边界外的每一个数据
         for(int i = 1; i <= la; i++){
             for(int j = 1; j <= lb; j++){  
                 //ints[i][j] 就等于ints[i-1][j] ints[i][j-1]这两个分别 插入一个数据 和删除一个数据需要的操作次数少的一个 再进行一步插入或者删除
                 ints[i][j] = Math.min(ints[i-1][j] ,ints[i][j-1] ) + 1;
                 //如果a[i-1] == b[j-1] 这两个字符(第i个和第j个字符因为上面数组多给了一个所以才写a[i-1] == b[j-1])相等 那么这步就不需要操作 ints[i][j]就等于上面进行了插入或者删除操作算出来的ints[i][j] 和 它的上一步ints[i-1][j-1]比较 选一个最小的  如果a[i-1] != b[j-1] 说明需要一步替换操作 所以ints[i][j]就等于上面进行了插入或者删除操作算出来的ints[i][j] 和 它的上一步ints[i-1][j-1]加上一步替换操作后 比较 选一个最小的
                 if(a[i-1] == b[j-1]){
                     ints[i][j] = Math.min(ints[i][j] , ints[i-1][j-1]);
                 }else{                     
                     ints[i][j] = Math.min(ints[i][j] , ints[i-1][j-1] + 1);
                 }                 
             }
         }
         return ints[la][lb];
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值