尋找兄弟單詞

2021-06-21 11:38:58 字數 1754 閱讀 3344

題目:乙個單詞單詞字母交換,可得另乙個單詞,如army->mary,成為兄弟單詞。提供乙個單詞,在字典中找到它的兄弟。描述資料結構和查詢過程。

解法一:使用hash_map和鍊錶

(1)首先定義乙個key,使得兄弟單詞有相同的key,不是兄弟的單詞有不同的key。例如,將單詞按字母從小到大重新排序後作為其key,比如bad的key為abd,good的key為dgoo。 

(2)使用鍊錶將所有兄弟單詞串在一起,hash_map的key為單詞的key,value為鍊錶的起始位址。 

(3)開始時,先遍歷字典,將每個單詞都按照key加入到對應的鍊錶當中。

(4)當需要找兄弟單詞時,只需求取這個單詞的key,然後到hash_map中找到對應的鍊錶即可。 

這樣建立hash_map時時間複雜度為o(n),查詢兄弟單詞時時間複雜度是o(1)。

解法二:同樣使用hash_map和鍊錶

(1)將每乙個字母對應乙個質數,然後讓對應的質數相乘,將得到的值進行hash,這樣兄弟單詞的值就是一樣的了,並且不同單詞的質數相乘積肯定不同。

(2)使用鍊錶將所有兄弟單詞串在一起,hash_map的key為單詞的質數相乘積,value為鍊錶的起始位址。

(3)對於使用者輸入的單詞進行計算,然後查詢hash,將鍊錶遍歷輸出就得到所有兄弟單詞。

這樣建立hash_map時時間複雜度為o(n),查詢兄弟單詞時時間複雜度是o(1)。

如果是海量詞典的話,可以用b+樹。。。。

注:上述兩種方法是比較高效的演算法,一下介紹一種普通方法:

解法三:全排列,然後依次比較

看到這個題目後,直覺是可能是這樣的:求出輸入單詞的全部變換(假如單詞的長度是n,則其全部變換有n!個。如果有相同的字母就不是n!了),求出單詞的變換後,判斷每個變換是否在字典中。例如對於輸入abc,則其變換有3!=6種:abc、acb、bca、bac、cab、cba。然後在依次判斷這6個單詞(當然這裡不是單詞了,而是字串)是否在字典中,如果在字典中則記錄下來。

很明顯這種思想的複雜度是比較高的,因為對於n稍微大點的話,n!是乙個很可怕的遞增過程,因此這個方法是不太可取的。

以下是全排列**:

/**

* @param

src *

@param

start 起始位置索引

* @param

end 結束位置索引

*/public

static

void perm(string src,int start,int

end)

system.out.println();

}else}}

將字典中的和『比較單詞』首字母相同的單詞取出存放到乙個陣列中,將每乙個組合和字典中的單詞比較。首先比較單詞長度,長度相同,則繼續比較;否則,比較下乙個單詞。演算法如下:

/**

* @param

src 字典中的單詞

* @param

des 要比較的單詞,因為要做大量比較,所以轉化為字元陣列

* @return

*/public

static

boolean

compare(string src,string des)

int i = 1;//

i等於1是因為首字元已經相同,無需比較

while(i

return

false

; }

return

true

; }

演算法題 兄弟單詞

在字典樹的字首中再儲存乙個vector結構的容器 struct word 首先根據字典中的單詞來建立字典樹,建立的時候,需要稍微特殊處理一下,就是比如pots stop和tops互為兄弟單詞,那麼在字典中按照首字母順序的話,應該先遇到pots單詞,那麼我首先對其進行排序,結果是opts,那麼字典樹中...

27 查詢兄弟單詞

輸入描述 先輸入字典中單詞的個數,再輸入n個單詞作為字典單詞。輸入乙個單詞,查詢其在字典中兄弟單詞的個數 再輸入數字n 輸出描述 根據輸入,輸出查詢到的兄弟單詞的個數 思路 將所有單詞加入wordlist,然後遍歷查詢 while true try string input strip split ...

Trie樹兄弟單詞例項

如果乙個單詞,將其字母順序重新排列可以生成另乙個單詞,則稱這兩個單詞是兄弟單詞。如 mary army cinema iceman 現在給定乙個字典,使用者輸入乙個單詞,如何根據字典找出這個單詞有哪些兄弟單詞?要求時間和空間效率盡可能的高。利用trie樹就可以妥善解決。只需將上面的樹節點增加乙個ve...