變位詞問題

2021-08-21 21:22:49 字數 1447 閱讀 3187

問題描述:

給定乙個英語詞典,找出其中的所有變位詞集合。例如,「pots」、「stop」和「tops」互為變位詞,因為每乙個單詞都可以通過改變其他單詞中的字母的順序來得到。 

問題解析:

變位詞具有相同的長度,相同的字元,唯一的區別就是這些相同的字元按照不同的順序排列成不同的字串而已。如果有一種方法唯一標識這些相同的字元,那麼這個問題好解決了。 

解決方案:

方案1:

對於這個問題,最快想到的最直接的方法就是針對每乙個單詞跟字典中的其他單詞進行比較。然而,假設一次比較至少花費1微秒的時間,則擁有二十萬單詞的字典將花費:200000單詞 x 200000比較/單詞 x 1微秒/比較 = 40000x10^6秒 = 40000秒 ≈ 11.1小時。比較的次數太多了,導致效率低下,我們需要找出效率更高的方法。

方案2:

按照字母順序對每個單詞進行標識並把這些具有相同標識的詞集合到一起。

(1)將輸入檔案中的所有單詞加標識並輸出到另乙個檔案中。

(2)將有標識的輸出檔案中所有的詞依(標識,單詞)對的形式儲存到記憶體。這裡使用

c++的mutimap和set來完成。

這裡出現了標識-單詞(key-value)對,我們很容易想到c++中的關聯容器multimap,使用multimap的好處就是:動態管理記憶體,容器大小動態改變;單詞與它的標識一一對應,對於相同標識(key)的單詞直接加在值(value)後面;無需根據標識排序,因為multimap會自動按關鍵字有序(預設公升序)。

所以,在將每個單詞及其標識存入multimap以後,就可以直接遍歷輸出了,每乙個multimap元素就是乙個變位詞集合。

#include #include #include #include

#include #include using namespace std; #define wordmax 100

int char_comp(const void *x, const void *y)

char *mytolower(char *lword, char *word)void add_sign(file *rfile, file *wfile)

}void print_anagrams(file *rfile,file *wfile)

for (set::iterator iter = myset.begin(); iter != myset.end(); ++iter)

cout << endl;

}}int main()

**解題思路:

如果不允許進行預處理,那麼我們只能順序遍歷整個字典,計算每個單詞的標識與給定單詞的標識比較。如果允許進行預處理,我們可以如上述思路二將所有單詞加入乙個map,然後輸出關鍵字(給定單詞的標識)對應的值,值中就包含了該單詞的所有兄弟單詞。

變位詞判斷問題

heart earth python typhon 寫乙個bool函式判斷兩個詞是否為變位詞 解法1 逐字檢查 由於在python中字串其中字元無法改變,先將單詞賦值到列表中 解法1執行時間數量級為o n 2 def anagram1kenn s1,s2 alist list s1 blist li...

尋找變位詞

程式設計珠璣 五 尋找變位詞 今天的問題是關於變位詞的,首先來看問題的描述 給定一本英語單詞詞典,請找出所有的變位詞集。所謂的變位詞是指,組成各個單詞的字母完全相同,只是字母排列的順序不同。比如,pots stop tops就是變位詞。將變位詞程式組織成三段式的 管道 結構,前乙個程式的輸出檔案將是...

變位詞排序

請編寫乙個方法,對乙個字串陣列進行排序,將所有變位詞合併,保留其字典序最小的乙個串。這裡的變位詞指變換其字母順序所構成的新的詞或短語。例如 和 integral 就是變位詞。給定乙個string的陣列str和陣列大小int n,請返回排序合併後的陣列。保證字串串長小於等於20,陣列大小小於等於300...