LeetCode //C - 211. Design Add and Search Words Data Structure

Design a data structure that supports adding new words and finding if a string matches any previously added string.

Implement the WordDictionary class:

  • WordDictionary() Initializes the object.
  • void addWord(word) Adds word to the data structure, it can be matched later.
  • bool search(word) Returns true if there is any string in the data structure that matches word or false otherwise. word may contain dots '.' where dots can be matched with any letter.
Example:

Input:

"WordDictionary","addWord","addWord","addWord","search","search","search","search"

\[\],\["bad"\],\["dad"\],\["mad"\],\["pad"\],\["bad"\],\[".ad"\],\["b..."\]

Output:

null,null,null,null,false,true,true,true

Explanation:

WordDictionary wordDictionary = new WordDictionary();

wordDictionary.addWord("bad");

wordDictionary.addWord("dad");

wordDictionary.addWord("mad");

wordDictionary.search("pad"); // return False

wordDictionary.search("bad"); // return True

wordDictionary.search(".ad"); // return True

wordDictionary.search("b..."); // return True

Constraints:
  • 1 <= word.length <= 25
  • word in addWord consists of lowercase English letters.
  • word in search consist of '.' or lowercase English letters.
  • There will be at most 2 dots in word for search queries.
  • At most 1 0 4 10^4 104 calls will be made to addWord and search.

From: LeetCode

Link: 211. Design Add and Search Words Data Structure


Solution:

Ideas:

1. TrieNode Structure:

Each node in the Trie is represented by a TrieNode structure. It has the following components:

  • An array of pointers, children, where each pointer corresponds to a letter in the English alphabet (26 lowercase letters).
  • A boolean flag, isEndOfWord, to signify whether a word ends at this node.

2. WordDictionary Structure:

The WordDictionary itself is represented by a structure, which holds a pointer to the root node of the Trie.

3. wordDictionaryCreate:

This function initializes the WordDictionary object and allocates memory for the root node of the Trie.

4. wordDictionaryAddWord:

This function is used to insert words into the Trie. For each character in the word, it traverses down the Trie, creating new nodes if needed, until the end of the word is reached, at which point it sets the isEndOfWord flag to true.

5. wordDictionarySearch and searchHelper:

  • The wordDictionarySearch function is used to search for a word in the Trie, with support for the . character, which can match any letter.
  • It calls a helper function searchHelper, which performs a recursive search to handle the . character.
  • If the searchHelper encounters a . character, it recursively checks all its children.
  • If it can traverse the entire word and reach a node where isEndOfWord is true, it returns true; otherwise, it returns false.

6. wordDictionaryFree and freeNode:

  • These functions deallocate the memory used by the WordDictionary and its nodes.
  • freeNode is a recursive function that frees all the child nodes before freeing the parent node.
Code:
c 复制代码
#define ALPHABET_SIZE 26

typedef struct TrieNode {
    struct TrieNode *children[ALPHABET_SIZE];
    bool isEndOfWord;
} TrieNode;

typedef struct {
    TrieNode *root;
} WordDictionary;

TrieNode* createNode() {
    TrieNode *newNode = (TrieNode *)calloc(1, sizeof(TrieNode));
    return newNode;
}

WordDictionary* wordDictionaryCreate() {
    WordDictionary *dict = (WordDictionary *)malloc(sizeof(WordDictionary));
    dict->root = createNode();
    return dict;
}

void wordDictionaryAddWord(WordDictionary* obj, char * word) {
    TrieNode *node = obj->root;
    for (int i = 0; word[i] != '\0'; i++) {
        int index = word[i] - 'a';
        if (!node->children[index])
            node->children[index] = createNode();
        node = node->children[index];
    }
    node->isEndOfWord = true;
}

bool searchHelper(TrieNode *node, char *word) {
    for (int i = 0; word[i] != '\0'; i++) {
        if (word[i] == '.') {
            for (int j = 0; j < ALPHABET_SIZE; j++) {
                if (node->children[j] && searchHelper(node->children[j], word + i + 1))
                    return true;
            }
            return false;
        } else {
            int index = word[i] - 'a';
            if (!node->children[index])
                return false;
            node = node->children[index];
        }
    }
    return node->isEndOfWord;
}

bool wordDictionarySearch(WordDictionary* obj, char * word) {
    return searchHelper(obj->root, word);
}

void freeNode(TrieNode *node) {
    for(int i = 0; i < ALPHABET_SIZE; i++)
        if(node->children[i])
            freeNode(node->children[i]);
    free(node);
}

void wordDictionaryFree(WordDictionary* obj) {
    if(!obj) return;
    freeNode(obj->root);
    free(obj);
}

/**
 * Your WordDictionary struct will be instantiated and called as such:
 * WordDictionary* obj = wordDictionaryCreate();
 * wordDictionaryAddWord(obj, word);
 
 * bool param_2 = wordDictionarySearch(obj, word);
 
 * wordDictionaryFree(obj);
*/
相关推荐
西望云天1 天前
The 2024 ICPC Asia Nanjing Regional Contest(2024南京区域赛EJKBG)
数据结构·算法·icpc
无敌最俊朗@1 天前
C/C++ 关键关键字面试指南 (const, static, volatile, explicit)
c语言·开发语言·c++·面试
10岁的博客1 天前
容器化安装新玩法
算法
不会算法的小灰1 天前
HTML简单入门—— 基础标签与路径解析
前端·算法·html
酷~1 天前
C语言模拟面向对象编程方法之多态
c语言·开发语言
flashlight_hi1 天前
LeetCode 分类刷题:1901. 寻找峰值 II
python·算法·leetcode
深瞳智检1 天前
YOLO算法原理详解系列 第007期-YOLOv7 算法原理详解
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪
郝学胜-神的一滴1 天前
中秋特别篇:使用QtOpenGL和着色器绘制星空与满月
开发语言·c++·算法·软件工程·着色器·中秋
qiuiuiu4131 天前
CPrimer Plus第十六章C预处理器和C库总结2-qsort函数
java·c语言·算法