两个字符串之间的最短编辑距离

1.算法原理

编辑距离(Edit Distance)是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数,编辑操作包括增、删、改操作。
例如将kitten一字转成sitting:sitten (k→s)sittin (e→i)sitting (→g),最短编辑距离为3.
跟“最长公共子序列”一样,我们采用一个二维数组来保存字符串X和Y当前的位置的最小编辑距离。

现有两个序列X={x1,x2,x3,...xi},Y={y1,y2,y3,....,yi},
设一个C[i,j]: 保存Xi与Yj的当前最小的LD。
①:当 Xi = Yi 时,则C[i,j]=C[i-1,j-1];
②:当 Xi != Yi 时, 则C[i,j]=Min{C[i-1,j-1],C[i-1,j],C[i,j-1]}+1;

最终我们的C[i,j]一直保存着最小的LD。

具体过程如下图所示:

两个字符串之间的最短编辑距离_第1张图片

2.Java实现

public static int[][] getLD(String str1, String str2)
{
	int leng1 = str1.length();
	int leng2 = str2.length();
	int[][] lens = new int[leng1+1][leng2+1];
	//首先初始化数组的第一行和第一列
	for(int i=0; i<=leng1; i++)
	{
		lens[i][0] = i;
	}
	for(int i=0; i<=leng2; i++)
	{
		lens[0][i] = i;
	}
	//计算数组其他位置的大小
	for(int i=1; i<=leng1; i++)
	{
		for(int j=1; j<=leng2; j++)
		{
			if(str1.charAt(i-1) == str2.charAt(j-1))
			{
				lens[i][j] = lens[i-1][j-1];
			}
			else
			{
				int tmp = Math.min(lens[i][j-1], lens[i-1][j]);
				lens[i][j] = Math.min(tmp, lens[i-1][j-1]) + 1;
			}
		}
	}
	return lens;
}

你可能感兴趣的:(算法)