LeetCode解題方法5 動態規劃求距離問題

2021-10-02 14:02:22 字數 2011 閱讀 5390

?-簡單距離問題

72-編輯距離(困難)

採用動態規劃思想,求出轉移方程dp[i][j]=?。

**

bool ismatch

(char

* s,

char

* p)

dp[0]

[0]= true;

for(i =

0; i < len2; i++)}

for(i =

0; i < len1; i++)if

(p[j]

=='*'

&& j >0)

else}}

}return dp[len1]

[len2]

;}

題目

給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 。

你可以對乙個單詞進行如下三種操作:

插入乙個字元

刪除乙個字元

替換乙個字元

示例 1:

輸入: word1 = 「horse」, word2 = 「ros」

輸出: 3

解釋:horse -> rorse (將 『h』 替換為 『r』)

rorse -> rose (刪除 『r』)

rose -> ros (刪除 『e』)

示例 2:

輸入: word1 = 「intention」, word2 = 「execution」

輸出: 5

解釋:intention -> inention (刪除 『t』)

inention -> enention (將 『i』 替換為 『e』)

enention -> exention (將 『n』 替換為 『x』)

exention -> exection (將 『n』 替換為 『c』)

exection -> execution (插入 『u』)

由於該題用回溯方法會超時,只能用動態規劃的方法。

先將複雜問題變簡單,用dp[i][j]表示字串word1的1至i,變化到字串word2的1至j,最少需要多少步。

dp[i][j]的計算方法可以根據dp[i - 1][j - 1], dp[i][j - 1] , dp[i - 1][j],

當dp[i][j - 1]為x時,由於word2長度j-1變為j,word1變化至word2需要增加一次插入,次數為x+1

當dp[i - 1][j]為x時,由於word1長度i-1變為i,word1變化至word2需要增加一次刪除,次數為x+1

當dp[i - 1][j - 1]為x,且word1[i ] == word2[j],word1變化至word2不需要增加變化次數,次數為x

當dp[i - 1][j - 1]為x,且word1[i ] != word2[j],word1變化至word2需要增加一次替換,次數為x+1

此外注意一下陣列的邊界,dp[i][0] = i和dp[0][j] = j

**

#define min(a, b) ((a)<(b)?(a):(b))

intmindistance

(char

* word1,

char

* word2)

dp =

(int**

)malloc

(sizeof

(int*)

*(len1 +1)

);for(i =

0; i < len1 +

1; i++

)for

(j =

1; j < len2 +

1; j++

)for

(i =

1; i < len1 +

1; i++

)else}}

return dp[len1]

[len2]

;}

LeetCode解題方法2 動態規劃求回文

最長回文子串 題目 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 狀態轉移陣列 dp i j 0表示從j到i的字串不為回文字串 dp i j 1表示...

LeetCode解題記錄(5)

我將慢慢開始做leetcode上的題,並做解題記錄發布在這裡。我每題會給出一到多個解法,記錄思考過程。我演算法巨爛,是想通過這種方式稍微補補,基本功和我一樣差的小夥伴可以和我一起共勉,有大神路過可以指點一二,我感激不盡。解題的最底要求是能通過leetcode的檢測,我不會喪病的為了各種提高效率在乙個...

LeetCode解題方法之 空指標

203.remove linked list elements 1.這樣可以處理空鍊錶特殊情況,頭指標為要刪除的值的特殊情況 使用空指標p在這裡的好處在於,1.p儲存了頭結點,2.而最開始pre和p指向了同乙個節點物件,這樣如果首節點是空節點或等於val時,可以直接進行操作,因此首節點也可以當做普通...