1183 编辑距离
1 秒 131,072 KB 0 分 基础题
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
sitten (k->s)
sittin (e->i)
sitting (->g)
所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
给出两个字符串a,b,求a和b的编辑距离。
输入
第1行:字符串a(a的长度 <= 1000)。
第2行:字符串b(b的长度 <= 1000)。
输出
输出a和b的编辑距离
输入样例
kitten
sitting
输出样例
3
原题链接
在做提的时候没有什么思路所以百度了一下,所得是用最小编辑距离做,所以有百度了一下最小编辑距离。个人现在理解不深,在此附上以为大佬的链接。感谢这位大佬的分享。大佬的最小编辑距离链接
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Scanner input = new Scanner(System.in);
char[] str1 = input.nextLine().toCharArray();
char[] str2 = input.nextLine().toCharArray();
int n = str1.length;
int m = str2.length;
int[][] dp = new int[n+1][m+1];//dp[i][j]表示str1前i个字符的字符串和str2的前j个字符的字符串之间的最小编辑距离。
int INF = Integer.MAX_VALUE-10000;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
dp[i][j] = INF;
}
}
for(int i=1; i<=n; i++) dp[i][0] = i;
for(int i=0; i<=m; i++) dp[0][i] = i;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
int flag = 1;
if(str1[i-1] == str2[j-1]) {
flag = 0;
}
dp[i][j] = Math.min(dp[i-1][j]+1, Math.min(dp[i][j-1]+1, dp[i-1][j-1]+flag)); //通过这样迭代可以保证最后的编辑距离最小。
}
}
System.out.println(dp[n][m]);
}
}