如何找出字典中的兄弟單詞

2021-06-09 20:10:19 字數 1121 閱讀 2790

思路一:使用trie樹。

在字典樹的字首中再儲存乙個vector結構的容器:

cpp**  

struct word  

;  

如上述資料結構所示,字典樹的建立是在預處理階段完成的,首先根據字典中的單詞來建立字典樹,建立的時候,需要稍微特殊處理一下,就是比如pots、stop和tops互為兄弟單詞,那麼在字典中按照首字母順序的話,應該先遇到pots單詞,那麼我首先對其進行排序,結果是opts,那麼字典樹中就分別建立4個節點,分別為o->p->t->s,當然這個是不同層次的,在節點s處的vector容器brother中新增單詞pots,遇到stop的時候,同樣的方法,排序是opts,此時發現這4個節點已經建立了,那麼只需要在第四個節點s處的vector容器brother中新增單詞stop,tops單詞的處理方法是同樣的。

這樣建立完字典樹後,查詢兄弟單詞的效率就會很高了,比雜湊的效率還要高;查到tops的兄弟的單詞的時候,首先排序,那麼就是opts,然後在字典樹中查詢opts,在s處將其vector容器brother中的的單詞輸出就是tops的所有兄弟單詞。

思路二:使用hash_map和鍊錶。 

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

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

開始時,先遍歷字典,將每個單詞都按照key加入到對應的鍊錶當中。當需要找兄弟單詞時,只需求取這個單詞的key,然後到hash_map中找到對應的鍊錶即可。 

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

思路三:同樣使用hash_map和鍊錶。

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

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

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

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

如何找出字典中的兄弟單詞

思路一 使用trie樹。在字典樹的字首中再儲存乙個vector結構的容器 cpp struct word 如上述資料結構所示,字典樹的建立是在預處理階段完成的,首先根據字典中的單詞來建立字典樹,建立的時候,需要稍微特殊處理一下,就是比如pots stop和tops互為兄弟單詞,那麼在字典中按照首字母...

如何找出字典中的兄弟單詞

給定乙個單詞a,如果通過交換單詞中字母的順序可以得到另外的單詞b,那麼定義b是a的兄弟單詞。現在給定乙個字典,使用者輸入乙個單詞,如何根據字典找出這個單詞有多少個兄弟單詞?答案 使用hash map和鍊錶。首先定義乙個key,使得兄弟單詞有相同的key,不是兄弟的單詞有不同的key。例如,將單詞按字...

找出字典中最小value值對應的key

今天做乙個練習題,遇到乙個問題,就是找字典中最小value值對應的key,1.我自己寫了一段,就是利用min函式先找到最小value,然後遍歷字典一遍找對應的key值。d minkeylst minvalue min d.values for i,j in d.items if j minvalue...