動態規劃 計算字串之間的距離

2021-08-22 17:48:38 字數 1162 閱讀 9186

levenshtein 距離,又稱編輯距離,指的是兩個字串之間,由乙個轉換成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。編輯距離的演算法是首先由**科學家levenshtein提出的,故又叫levenshtein distance。

字串a:abcdefg

字串b: abcdef

通過增加或是刪掉字元」g」的方式達到目的。這兩種方案都需要一次操作。把這個操作所需要的次數定義為兩個字串的距離。

給定任意兩個字串,寫出乙個演算法計算它們的編輯距離。

示例1

abcdefg

abcdef

定義ic,dc,rc分別為插入、刪除、修改的代價,在本題中ix = dc = rc = 1,dp[i][j] 表示a的前i個字元轉換成b的前y個字元所需要的最小代價

對於動態陣列的第一行來說,dp[0][j]表示將乙個空串轉換成b的j個字元需要的代價為ic * j;

對於動態陣列的第二行來說,dp[i][0]表示將a的前i個字元刪除所需要的代價為dc * i;

對於dp[i][j],取下面的最小值

dp[i-1][j-1]; //a[i-1] == b[i-1]

dp[i-1][j-1] + rc; //a[i-1] != b[i-1]

dp[i-1][j] + dx; // 刪除乙個字元,將a的前i-1轉換成b的前j個字元

dp[i][j-1] + ic; //插入乙個字元,將a的前i - 1和字元轉換為b的前j個字元

#include 

#include

using

namespace

std;

int main()

for (int i=1; i<=col; ++i)

dp[0][i] = ic*i;

for (int i=1; i<=row; ++i)

dp[i][0] = dc*i;

for (int i=1; i<=row; ++i)

}cout

<< dp[row][col] }

return

0;}

動態規劃 計算字串編輯距離

題目 設a 和b 是2 個字串。要用最少的字元操作將字串a 轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b 所用的最少字元運算元稱為字串a到b 的編輯距離,記為d a,b 試設計乙個有效演算法,對任給的2 個字串a和b,計...

字串的擴充套件距離問題(動態規劃)

對於長度相同的2個字串a和b,其距離定義為相應位置字元距離之和。2個非空格字元的距離是它們的ascii碼之差的絕對值 空格與空格的距離為0,空格與其他字元的距離為乙個定值k。在一般情況下,字串a和b的長度不一定相同。字串a的擴充套件是在a中插入若干空格字元所產生的字串。在字串a和b的所有長度相同的擴...

20101106 動態規劃訓練 字串距離

源程式名 blast.pas,c,cpp 可執行檔名 blast.exe 輸入檔名 blast.in 輸出檔名 blast.out 問題描述 設有字串x,我們稱在x的頭尾及中間插入任意多個空格後構成的新字串為x的擴充套件串,如字串x為 abcbcd 則字串 abcb cd a bcbcd 和 abc...