關於LeetCode解題提公升(二)

2022-05-18 13:53:40 字數 1364 閱讀 6420

今天遇到一道題,不得不說,思路決定一切,分享一下我的解題心路歷程和對大佬的解題方式的解析與感想。

820. 單詞的壓縮編碼

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

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

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

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

示例:輸入: words = ["time", "me", "bell"]

輸出: 10

說明: s = "time#bell#" , indexes = [0, 2, 5] 。

1 <= words.length <= 2000

1 <= words[i].length <= 7

每個單詞都是小寫字母 。

言簡意賅的解釋一下題目要求:比如說time和me ,因為me是time的字尾 所以要去掉,因為可以從time#中找到me#,不需要再次建立time#me#,這樣就形成了個最短的字串長度。

我的思路: 一開始建立乙個集合(目的去重),將words中的字串存入集合中,然後訪問集合,刪掉當前字串的字尾。最後加上集合中(所有字串的長度+1),就是最終的最短長度。寫出來後雖然過了但是執行比較慢,看了官方解析後將**優化如下(發現居然可以用substr來刪字尾,還是不熟練呀)。

當然,這題也可以用字典樹來解決,不過空間複雜度會比較大(其實是喜歡**簡潔)。

class

solution

};

複雜度較高,為指數級。

下面分享一下大佬思路(驚豔到了)。

首先無論是什麼語言,排序字串的容器總是按照字典序來的,那麼我們可以發現乙個規律,將所有字串倒序,例如:time -> emit  me->em dell->lled,此時我們再排序,是不是em 一定在emit前面,我們是不是就可以更加輕鬆的找到em,並且刪除。無論任何字串,都可以按照字典序來一一排除,最後剩下沒有存在字尾的字串。

大佬**:

class

solution

sort(words.begin(),words.end());

int res=0

;

for(int i=0;i1;i++)

return res+words.back().size()+1

; }

};

只能說思路太強。

打卡:遇到字串去重去字尾,首先思考集合,字典樹,然後反轉字典序排序。

關於Leetcode解題提公升(一)

題目總結 一.拼寫單詞 二.最長回文串 三.水壺問題 四.兩數之和 五.最小的k個數 紮實基礎,最為重要。題目一 拼寫單詞 給你乙份 詞彙表 字串陣列 words 和一張 字母表 字串 chars。假如你可以用 chars 中的 字母 字元 拼寫出 words 中的某個 單詞 字串 那麼我們就認為你...

leetcode解題記錄(二)

問題描述 編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 示例1 輸入 flower flow flight 輸出 fl 示例2 輸入 dog racecar car 輸出 解釋 輸入不存在公共字首。說明 所有輸入只包含小寫字母 a z 思路 首先找出陣列中長度最短的字串...

Leetcode解題思路

所有簡單題的解題思路。question count the number of prime numbers less than a non negative number,n example input 10output 4explanation there are 4 prime numbers ...