51Nod 1183 编辑距离

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

原题链接

  在做提的时候没有什么思路所以百度了一下,所得是用最小编辑距离做,所以有百度了一下最小编辑距离。个人现在理解不深,在此附上以为大佬的链接。感谢这位大佬的分享。

大佬的最小编辑距离链接

  下面是我简单的理解,从两个字符串的第一位开始比较,如果两个字符相同,则在最小的基础上加0, 如果不同则在最小上加1。不断迭代,最终得到正确的结果。在迭代的过程中会将最长的相同字符对找出来。不知道理解对不对,多参考上面的链接吧。
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]);	
	}
}

你可能感兴趣的:(51Nod_Java)