資料結構與演算法分析 leetcode筆記

2021-10-04 12:45:59 字數 2034 閱讀 3400

深度學習知識及資源分享,學習交流,共同進步~

leetcode:820

(1)題目

給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 s 與乙個索引列表 a。

例如,如果這個列表是 [「time」, 「me」, 「bell」],我們就可以將其表示為 s = 「time#bell#」 和 indexes = [0, 2, 5]。

對於每乙個索引,我們可以通過從字串 s 中索引的位置開始讀取字串,直到 「#」 結束,來恢復我們之前的單詞列表。

那麼成功對給定單詞列表進行編碼的最小字串長度是多少呢?

(2)解法

class

solution

:def

minimumlengthencoding

(self, words: list[

str])-

>

int:

words =

[word[::

-1]for word in words]

words.sort(reverse=

true

)#按單詞大小逆序排序,確保前面的單詞"不小於"後者

ans, curword =

0, words[0]

for word in words[1:

]:if curword.startswith(word)

:#如果字首相同,說明可壓縮

continue

else

: ans +=

len(curword)+1

#加上當前可壓縮區間的單詞長度

curword = word

ans +=

len(curword)+1

#加上最後乙個長度

return ans

(3)解題思路分析

理解題意之後,兩個單詞可"合併編碼"意味著具有相同字尾,且即使是不連續的單詞也可能可以合併編碼。

所以直觀的想法是:

為了便於連續比較,首先要將單詞按字尾順序排序 為了便於字尾排序,需首先對所有單詞執行一遍倒序

標記乙個當前可合併編碼的最長單詞curword,且curword可能可合併的區間長度不止2個單詞,只要這些單詞具有逆序後的公共字首

對單詞排序時進行逆序,可保證curword永遠"不小於"新單詞(包括長度和字首均不小於)

對單詞列表中所有單詞逐一判斷:

– 如果新單詞與curword可以合併,直接進入下一迴圈

– 否則,需要更新結果長度,即加curword+1的長度,同時更新curword為新單詞

注意最後乙個curword未在迴圈中加入,所以再補充一下即可

由於字串不允許更改,所以逆序和之後切片比較的過程實際上都占用了空間,意味著本方法的空間複雜度會很低o(n*k)

(4)演算法注釋

a[:-1]與a[::-1]區別

a[:-1]是去掉陣列最後一位

例:

a =[1,

2,3,

4]print

(a[:-1

]

a[::-1]是將陣列所有元素逆置

a =[1

,2,3

,4]print

(a[::-1])

startswith()

startswith() 方法用於檢查字串是否是以指定子字串開頭,如果是則返回 true,否則返回 false。如果引數 beg 和 end 指定值,則在指定範圍內檢查。

str

.startswith(

str, beg=

0,end=

len(string)

);

問渠那得清如許,為有源頭活水來~

資料結構與演算法分析

資料結構與演算法分析可以稱得上是程式設計師必須修煉的內功心法。資料的儲存結構 資料元素在計算機中的儲存方式 資料的操作集合 對一種資料型別的資料所有操作,例如對資料的增刪改查等等!演算法分析主要分析 下面是一些常用資料結構 一 線性表 1.陣列實現 2.鍊錶 二 棧與佇列 三 樹與二叉樹 1.樹2....

資料結構與演算法分析

資料結構 大量資料的組織方法 演算法分析 演算法執行時間的估算。涉及到計算效率。設想,如果能把時間限制從16年減至不到1秒,不很神奇嗎?在很多問題中,乙個重要的觀念是 寫出乙個可以工作的程式並不夠。如果這個程式在巨大的資料集上執行,執行時間就成了重要的 問題。演算法,是為求解乙個問題需要遵循的 被清...

資料結構與演算法分析 note

1 explicit建構函式是用來防止隱式轉換的。請看下面的 class test1 普通建構函式 private int num class test2 explicit 顯式 建構函式 private int num int main test1的建構函式帶乙個int型的引數,23行會隱式轉換成...