java题目 HJ52 计算字符串的编辑距离

描述

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

Ex:

字符串A: abcdefg

字符串B: abcdef

通过增加或是删掉字符 ”g” 的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。

要求:

给定任意两个字符串,写出一个算法计算它们的编辑距离。
 

 

数据范围:给定的字符串长度满足 1 \le len(str) \le 1000 \1len(str)1000 

 

 

输入描述:

每组用例一共2行,为输入的两个字符串

输出描述:

每组用例输出一行,代表字符串的距离

示例1

输入:
abcdefg
abcdef
输出:
1

 

 

 1 import java.util.Scanner;
 2  
 3 public class Main{
 4     public static void main(String[] args){
 5         Scanner sc=new Scanner(System.in);
 6         while(sc.hasNext()){
 7             //输入字符串A
 8             String s1=sc.next();
 9             //输入字符串B
10             String s2=sc.next();
11             //计算字符串A和字符串B的距离
12             System.out.println(distance(s1,s2));
13         }
14     }
15     private static int distance(String s1,String s2){
16         int m=s1.length();
17         int n=s2.length();
18         //定义dp数组
19         int[][] dp=new int[m+1][n+1];
20         //状态初始化
21         for(int i=1;i<=m;i++){
22             dp[i][0]=i;
23         }
24         for(int j=1;j<=n;j++){
25             dp[0][j]=j;
26         }
27         //状态转移
28         for(int i=1;i<=m;i++){
29             for(int j=1;j<=n;j++){
30                 //如果相等,直接等于前一个位置的情况
31                 if(s1.charAt(i-1)==s2.charAt(j-1)){
32                     dp[i][j]=dp[i-1][j-1];
33                 }
34                 /*
35                 如果不相等,要么B字符串插入A中i位置对应字符即dp[i][j]=dp[i-1][j]+1
36                 要么A字符串插入B中j位置对应字符即dp[i][j]=dp[i][j-1]+1,要么s1字符串
37                 i位置字符被s2字符串j位置字符替换,即dp[i][j]=dp[i-1][j-1]+1
38                 */
39                 else{
40                     dp[i][j]=Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
41                 }
42             }
43         }
44         return dp[m][n];
45     }
46 }

 

posted @ 2022-03-11 00:56  海漠  阅读(343)  评论(0编辑  收藏  举报