最短編輯距離 筆記

2021-10-02 09:49:51 字數 1722 閱讀 6181

思路:

線性dp的經典問題,首先是

狀態表示:

接下來是

轉移方程的推導:

推導的思路就是看dp[i][j]能由哪些狀態轉移過來(這不是廢話麼 ),由於每次可以進行三種操作,所以我們可以從操作上進行考慮

1.刪除操作

想一下dp[i][j]要進行刪除操作後才會使a的前i個與b的前j個相同,換而言之a的前i - 1個應該已經與b的前j個相同才對,因為刪除a[i]就表明a[i]對其a沒有貢獻,所以得到:

dp[

i][j

]=dp

[i−1

][j]

+1

dp[i][j]=dp[i−1][j]+1

dp[i][

j]=d

p[i−

1][j

]+1

2.新增操作

與刪除相同dp[i][j]進行新增之後相同說明i與j - 1已經相同只不過還差乙個而已所以再得到:

dp[

i][j

]=dp

[i][

j−1]

+1

dp[i][j]=dp[i][j−1]+1

dp[i][

j]=d

p[i]

[j−1

]+1

3.替換操作

最簡單操作了,如果a[i]與b[j]相等那就不用操作了直接從i - 1與j - 1轉移過來,否則就操作一次

a[i

]!=b

[j]:

dp[i

][j]

=dp[

i−1]

[j−1

]+

1a[i]!=b[j]:dp[i][j]=dp[i−1][j−1]+1

a[i]!=

b[j]

:dp[

i][j

]=dp

[i−1

][j−

1]+1

a [i

]==b

[j]:

dp[i

][j]

=dp[

i−1]

[j−1

]a[i]==b[j]:dp[i][j]=dp[i−1][j−1]

a[i]==

b[j]

:dp[

i][j

]=dp

[i−1

][j−

1]

邊界處理

轉移方程已推導完了,那麼接下來就是邊界情況的處理了。如果什麼也不處理i = 1時j = n時會發生什麼?對的,dp[i - 1][j]是恒為零的但這是不對的因為從0到j只需要經過j次新增即可使兩者相同,j = 0也類似。

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e4+5;

int n,m,dp[maxn]

[maxn]

;char a[maxn]

,b[maxn]

;int

main()

} cout << dp[n]

[m]<< endl;

return0;

}

最短編輯距離 python 最短編輯距離演算法實現

一,演算法介紹 在cs124課程的第一周提到 求解兩個字串相似度的演算法 minimum edit distance 最短編輯距離 演算法。該演算法在nlp 自然語言處理 中也會用到。如何定義相似度呢?任給兩個字串x 和y,使用以下三種操作將 字串x 變到 字串y 插入 insert 操作 刪除操作...

最短編輯距離

給定兩個字串a和b,現在要將a經過若干操作變為b,可進行的操作有 刪除 將字串a中的某個字元刪除。插入 在字串a的某個位置插入某個字元。替換 將字串a中的某個字元替換為另乙個字元。現在請你求出,將a變為b至少需要進行多少次操作。輸入格式 第一行包含整數n,表示字串a的長度。第二行包含乙個長度為n的字...

最短編輯距離

題目鏈結 給定兩個字串a和b,現在要將a經過若干操作變為b,可進行的操作有 刪除 將字串a中的某個字元刪除。插入 在字串a的某個位置插入某個字元。替換 將字串a中的某個字元替換為另乙個字元。現在請你求出,將a變為b至少需要進行多少次操作。輸入格式 第一行包含整數n,表示字串a的長度。第二行包含乙個長...