编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
sitten (k->s)
sittin (e->i)
sitting (->g)
所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
给出两个字符串a,b,求a和b的编辑距离。
状态定义:Fi,j表示第一个字符串的前i个字母和第二个字符串的前j个字母需要编辑的次数,求Fn,m,n和m分别是两个字符串的长度。
状态转移方程:
当Fi,j-1=Fi-1,j时,Fi,j=Fi,j-1;
当Fi,j-1!=Fi-1,j时,Fi,j=min{Fi-1,j-1,Fi,j-1,Fi-1,j}+1.
package com.basic.temp2;
import java.util.Scanner;
public class Demo
{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.nextLine();
String b = sc.nextLine();
int La = a.length();
int Lb = b.length();
sc.close();
int[][] arr = new int[La+1][Lb+1];
for(int i=0;i<La+1;i++)
{
arr[i][0]=i;
}
for(int i=0;i<Lb+1;i++)
{
arr[0][i] =i;
}
int temp;
for(int i=1;i<La+1;i++)
{
for(int j=1;j<Lb+1;j++)
{
if(a.charAt(i-1)==b.charAt(j-1))
{
temp=0;
}
else
{
temp = 1;
}
arr[i][j] = Math.min(arr[i-1][j]+1, Math.min(arr[i][j-1]+1,arr[i-1][j-1]+temp));
}
}
System.out.println(arr[La][Lb]);
}
}
今天真的是不顺利的一天哦,看来好几个题目然后都没写出来,不过还好,这个题目写出来了,遇上了君的名字这位女大佬,看到了她所写的这道题目的解法,很详细,也很用心,在网上很少能看到这么认真的大神。
言归正传,这道题是一道动态规划题目,首先要找到状态的定义,然后是状态转移方程的定义(这题的这个有点难理解),
先构造一个二位矩阵矩阵的航头和行尾用来存储标志位,d[i-1][j],d[i][j-1],d[i][kj]分别表示替换,增加,删除,
如果两个字符串的位不同,则需要进行操作,temp为1,否则为0