動態規劃之LeetCode第72題 編輯距離

2022-06-16 12:06:09 字數 1298 閱讀 2468

首先先學習乙個經典的演算法吧,就是和本題一模一樣的「編輯距離演算法」。編輯距離,minimum edit distance,簡稱med,是俄羅斯科學家 vladimir levenshtein 在2023年提出,也因此而得名 levenshtein distance。用來度量兩個序列相似程度的指標。通俗地來講,編輯距離指的是在兩個單詞之間,由其中乙個單詞w1轉換為另乙個單詞w2所需要的最少單字元編輯操作

1.插入

2.刪除

3.替換

關於這個演算法,還有乙個比較正規的數學形式定義:

我們將兩個字串a,b的 levenshtein distance 表示為 leva,b(|a|,|b|),其中|a|和 |b|分別對應a,b的長度。那麼,在這裡兩個字串 a,b的 levenshtein distance,

即leva,b(|a|,|b|)可用如下的數學語言描述:

題目:給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 。你可以對乙個單詞進行如下三種操作:

1.插入乙個字元

2.刪除乙個字元

3.替換乙個字元

1.定義乙個陣列二維dp,dp[i][j]表示字串word1中前i個字元和word2中前j個字元之間的距離,此處的i、j可以看作word1和word2的這兩個字串的長度;

2.根據上面的演算法,我們可以得出dp的元素之間的關係式,即:

if min(i,j) ==0, 那麼 dp[i][j] = max(i,j);

if min(i,j) != 0,那麼

if word1[i] == word2[j],那麼dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1])

if word1[i] != word2[j],那麼dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+1)

最終,dp[|word1|][|word|2]即為所求的最小值。

public

intmindistance(string word1, string word2)

for (int j = 1; j <= n; j++)

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

else}}

return

dp[m][n];

}

leetcode之動態規劃小結(一)

最近學習動態規劃有點吃力,感覺這個東西雖然說是有套路的,但是剛開始的時候還是覺得難。現在網上也有很多講動態規劃的原理以及做法的,我就不多說了,主要還是以例子來記錄一下最近的心得。你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜...

leetcode之動態規劃(更新ing)

給定乙個整數陣列 有正數有負數 找出總和最大的連續數列,並返回總和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。class solution def maxs...

leetcode 動態規劃

題目如下 給定乙個整型陣列,至少有乙個元素,請計算子陣列最大乘積是多少?子陣列必須是原陣列中連續的一串數字構成的陣列。整數可正可負。例如 給定陣列 2,3,2,4 經過計算,得到最大乘積為6。子陣列為 2,3 根據原貼的解題思路,這道題可以用動態規劃來解,但難度在 呢?負負得正,就可惡在這裡。那這個...