《編程珠璣》-第二章:尋找兄弟單詞+電話簿功能 算法研究

尋找兄弟單詞:這是我百度實習筆試的時候一道題目,面試的時候在HR的房間看到了我的試卷,發現這題我只得了兩分。。。這兩分還是因爲我想到了用樹結構,不過只是簡單的26叉字典樹。。。。 當時想到應該沒有這麼簡單,可是時間緊迫阿。

題目是這樣的:兄弟單詞(在《編程珠璣》一書中稱爲換位詞),就是隻使用項目的字母,不同的組合構成不同的單詞deposit,dopiest,posited,topside就是一組兄弟單詞,設計數據結構來存儲這些兄弟單詞。


題目變形:手機的電話簿功能,比如我的名字金子,輸入拼音時只需要按 546 94,但是不同的名字,可能有相同的數據序列表示。
 

出發點:讓兄弟單詞具有同樣的標識,比如 deposit ,dopiest,posited,topside,就可以將單詞中的字母排序 ,標識就爲deiopst了;標識的改進,比如單詞是mississippi這一單詞,按照字母排序結果爲iiiimppssss重複的字母很多,可以簡化爲i4mp2s4,m後面沒有數字表示m只出現了一次。

於是可以設計成數據結構:讀進來一個單詞,首先將單詞中的字母排序,得到一個標識,每個標識後面鏈接一個鏈表,鏈表裏每個節點存放的是該標識中的字母可以組成的單詞,值得注意的是,兄弟單詞的數目一般都小於他們的標識中字母全排列的個數。

至於標識的存儲,是採用字典樹呢?還是每個標識作爲一個節點,組成二元查找樹呢?我還沒想好,因爲題目的難點是你要想到使用“標識”(好繞嘴阿)。至於電話簿的功能,《編程之美》上有,我記得是類似於三階樹的原理。

發佈了19 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章