題目:
原題鏈結在這裡:
最長字串鏈。給乙個單詞列表,找乙個詞鏈,使得詞鏈後乙個單詞由前乙個單詞增加乙個字元得到,求最長詞鏈長度。
解答:1、根據詞鏈的定義,短的單詞可以由長的單詞減去單詞中乙個字元得到。因此可以先對單詞列表,按照單詞的長度從大到小排序。
2、單詞的最大長度為 16,因此可以對於每個單詞 word(已經按長度從大到小排好序了),遍歷 word 所有長度減 1 的子串(共有 len(word) 個)。
3、為了記錄最長詞鏈的長度,可以定義乙個字典 dic,鍵為單詞,值為以該單詞為首的最長詞鏈長度。dic 相當於動態規劃中的 dp 陣列,接下來要找狀態轉移方程。
4、對於單詞 word 的每乙個子串 sub,如果 sub 在單詞列表中能夠找到(這裡為了加快查詢速度,要先將單詞列表轉化為集合 set,查詢速度為 o(1)),則該子串 sub 的最長詞鏈長度取決於原來 sub 的最長詞鏈長度與在 word 的最長詞鏈長度基礎上加 1 中的最大值,即dic[sub] = max(dic[sub], dic[word] + 1)
。
5、最後,如果 dic 為空,則返回 1;如果不為空,則字典中某個字串儲存的最長詞鏈長度就是最終的答案,即max(dic.values()) + 1
。
leetcode 動態規劃
題目如下 給定乙個整型陣列,至少有乙個元素,請計算子陣列最大乘積是多少?子陣列必須是原陣列中連續的一串數字構成的陣列。整數可正可負。例如 給定陣列 2,3,2,4 經過計算,得到最大乘積為6。子陣列為 2,3 根據原貼的解題思路,這道題可以用動態規劃來解,但難度在 呢?負負得正,就可惡在這裡。那這個...
leetcode 動態規劃
題目 給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。每次只能向下或者向右移動一步。示例 輸入 1,3,1 1,5,1 4,2,1 輸出 7 解釋 因為路徑 1 3 1 1 1 的總和最小。思路 定義一維陣列dp用於記錄起始點到某一點最小距離,...
leetcode 動態規劃
3 動態規劃三要素 重疊子問題 最優子結構 狀態轉移方程 4 狀態轉移方程最難的 明確 狀態 定義 dp 陣列 函式的含義 明確 選擇 明確 base case f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.1 遞迴計算 複雜度高,指數級別 超時 時間複雜度 o 2 n cl...