?-簡單距離問題
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時,可以直接進行操作,因此首節點也可以當做普通...