變位詞 兩種演算法實現

2021-07-04 23:58:01 字數 1908 閱讀 3071



方案一:使用資料結構 map。兄弟單詞共用乙個簽名key,key為單詞內部排序後的詞條,list儲存同一key的單詞集合;相對於程式設計珠璣中的方法,該方法在空間上節省了每個單詞乙個key的空間;在時間上,不再需要二分查詢,o(1)的查詢;但是這種方法還可以優化,見方案二

方案二:使用trie樹。trie樹又稱字典樹,在面試題中關於「字串」與「數字串」型別的問題中高頻出現,非常實用。對於兄弟單詞,兄弟單詞公用乙個key自不必說,只是trie的節點結構應該多出乙個域list,用來儲存key對應的兄弟單詞;具體節點結構應該為

bool isstr, node* next[26], vectorbrothers
該方案查詢的複雜度為o(l),l為key的平均長度;空間上則有很大的優化,例如單詞的key有「abc」、「abcd」、「abcde」之類的形式,則這些key也能達到空間公用,不過資料量大還好,資料量小,trie樹開闢的空間還是有些浪費的,不多言,上**:

【測試用例】

input:

cba acb bc cb b

output:

cba acb

bc cb

b

【方案一:使用雜湊map實現兄弟單詞】

#include #include #include #include using namespace std;

#define maxlen 100 /* 單詞最大長度 */

/* qsort比較函式 */

int charcmp(const void *p, const void *q)

/* 列印輸出 & 釋放記憶體 */

void output(map> dic)

printf("\n"); }}

void main()

} output(dic);

}

【方案二:使用trie樹實現兄弟單詞】

注:分兩個檔案:brotrie.h,定義儲存兄弟單詞的trie樹結構;brotrie.cpp,演算法實現

/******* brotrie.h *******/

#include #define branchnum 26

/* trie節點 */

struct trienode

};/* trie類 */

class brotrie

/* 插入key對應的單詞 */

void insert(const char *key, const char *word)

location = location->next[*key-'a'];

++key;

} location->isstr = true;

location->bros.push_back(word);

} /* 輸出兄弟單詞 & 釋放記憶體 */

void outputbros(trienode * location)

printf("\n");

} for(int i = 0; i < branchnum; ++i) // 釋放記憶體

}delete location;

}};/******* brotrie.cpp *******/

#include using namespace std;

#include "brotrie.h"

#define maxlen 100 /* 單詞最大長度 */

/* qsort比較函式 */

int charcmp(const void *p, const void *q)

void main()

} browords.outputbros(browords.root);

}

演算法 變位詞

如果兩個單詞的組成字母完全相同,只是字母的排列順序不一樣,則它們就是變位詞,兩個單詞相同也被認為是變位詞。如tea 與eat nic 與cin,ddc與dcd,abc與abc 等。你的任務就是判斷它們是否是變位詞。第一行乙個n,表示下面有n行測試資料。每行測試資料報括兩個單詞,如tea eat 它們...

變位詞程式c 實現

include include include include include include usingnamespace std const int max n 100 5 const intmax words 1000 設定最多可對1000個變位詞進行處理 char line max n 讀檔...

變位詞程式的實現

這篇文章是 讀厚 程式設計珠璣 系列部落格 的第 2 篇,主要的內容是 程式設計珠璣 第二章最後提出的變位詞程式的實現。問題 於 程式設計珠璣 第二章中最後提出的變位詞程式的實現。其中的變位詞的概念,在第二章開篇的 c 問題中得到了闡釋。c.給定乙個英語詞典,找出其中所有變位詞的集合。例如,pots...