編輯距離(edit distance)

編輯距離:就是兩個字符串之間,由一個轉化爲另一個所需的最少編輯操作次數。

許可的編輯操作包括將

(1)一個字符替換爲另一個字符;

(2)插入一個字符;

(3)刪除一個字符;

 

可以用動態規劃解決這道題目:

設原始串是S[1,....n] ,目標串是T[1,.....m];

設d[i][j]表示子串S[1,...i] 轉化爲子串T[1,....j]的最短編輯距離。

那麼結果就是 d[n][m];

狀態轉移方程爲

d[i][j]=min{

                        d[i-1][j-1]+cost; //把原始串S的第i個字符替換爲目標串T的第j個字符。如果S[i]==T[j],cost=0,否則爲1.

                        d[i-1][j]+1        ; //把原始串S的第i個字符刪除

                        d[i][j-1]+1       ; // 在原始串S的第i個字符之後插入一個跟T[j]相同的字符。

                 }

複雜度是O(n*m)

 

推薦 poj1035

下面是用動態規劃實現的編輯距離代碼。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <string>
#include <vector>
using namespace std;
const int maxn = 100;
char a[maxn];
char b[maxn];
int d[maxn][maxn];
int main()
{
    while(scanf("%s %s",a+1,b+1)!=EOF)
	{
        int la=strlen(a+1);
		int lb=strlen(b+1);
		memset(d,0,sizeof(d));

		for(int i=1;i<=la;i++)
			d[i][0]=i;
		for(int i=1;i<=lb;i++)
			d[0][i]=i;
        
        for(int i=1;i<=la;i++)
		{
           for(int j=1;j<=lb;j++)
		   {
              if(a[i]==b[j])
				  d[i][j]=d[i-1][j-1];
			  else
				  d[i][j]=d[i-1][j-1]+1;
			  if(d[i-1][j]+1<d[i][j])
				  d[i][j]=d[i-1][j]+1;
			  if(d[i][j-1]+1<d[i][j])
				  d[i][j]=d[i][j-1]+1;
		   }
		}
		printf("%d\n",d[la][lb]);
	}
	return 0;
}


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章