方案一:使用資料結構 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...