1. 程式人生 > >兩個字串之間的最短編輯距離

兩個字串之間的最短編輯距離

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。

具體過程如下圖所示:


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;
}