首先先學習乙個經典的演算法吧,就是和本題一模一樣的「編輯距離演算法」。編輯距離,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]即為所求的最小值。
publicintmindistance(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 根據原貼的解題思路,這道題可以用動態規劃來解,但難度在 呢?負負得正,就可惡在這裡。那這個...