-
- // Returns true if key presents in trie, else false
- bool search(struct TrieNode **root, const char *key, int idx)
- {
- int level;
- int length = strlen(key);
- int index;
- struct TrieNode *pCrawl = *root;
- // pi(idx);
- for (level = 0; level < length; level++)
- {
- str_new(ch);
- str_insert_char(ch, key[level]);
- if (ch.type & STR_TYPE_DIGIT) index = INT_TO_INDEX(key[level]);
- else if (ch.type & STR_TYPE_ALPHABETIC) index = CHAR_TO_INDEX(key[level]);
- str_free(ch)
- if (!pCrawl->children[index]) {
- index = CHAR_TO_INDEX('x');
- if (!pCrawl->children[index]) return false;
- }
-
- pCrawl = pCrawl->children[index];
- // pp(pCrawl->next);
- if (pCrawl->next) {
- // pi(pCrawl->next->idx)
- // pp(*root)
- *root = pCrawl->next;
- // pp(*root)
- // bool result = search(pCrawl->next, key, idx);
- // pb(result);
- }
- }
-
- // pi(pCrawl->count)
- bool final_match = false;
- for (int i = 0; i < pCrawl->count; i++) {
- // pi(pCrawl->idx[i])
- if (pCrawl->idx[i] == idx) final_match = true;
- }
- // pb(final_match)
- return (pCrawl != NULL && pCrawl->isEndOfWord && final_match);
- }
-
- // Returns true if key presents in trie, else false
- bool search_segmented(struct TrieNode *root, struct TrieNode *segments, const char *key)
- {
- int level;
- int length = strlen(key);
- int index;
- struct TrieNode *pCrawl = root;
-
- str_new(segment);
- int idx = 0;
-
- for (level = 0; level < length; level++)
- {
- str_insert_char(segment, key[level]);
-
- ps(segment.string);
- // pp(segments)
- bool result1 = search(&segments, segment.string, idx);
- // pp(segments)
- pi(idx)
- pb(result1);
- if (result1) {
- str_reset(segment);
- idx++;
- }
- pi(idx)
- str_new(ch);
- str_insert_char(ch, key[level]);
- if (ch.type & STR_TYPE_DIGIT) index = INT_TO_INDEX(key[level]);
- else if (ch.type & STR_TYPE_ALPHABETIC) index = CHAR_TO_INDEX(key[level]);
- str_free(ch)
-
- if (!pCrawl->children[index]) {
- index = CHAR_TO_INDEX('x');
- if (!pCrawl->children[index]) return false;
- }
-
- pCrawl = pCrawl->children[index];
- }
- str_free(segment);
- return (pCrawl != NULL && pCrawl->isEndOfWord);
- }
-