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);
*/
相关推荐
DuHz11 分钟前
242-267 GHz双基地超外差雷达系统:面向精密太赫兹传感与成像的65nm CMOS实现——论文阅读
论文阅读·物联网·算法·信息与通信·毫米波雷达
AI科技星44 分钟前
时空的固有脉动:波动方程 ∇²L = (1/c²) ∂²L/∂t² 的第一性原理推导、诠释与验证
数据结构·人工智能·算法·机器学习·重构
2401_841495641 小时前
【LeetCode刷题】寻找重复数
数据结构·python·算法·leetcode·链表·数组·重复数
罗技1231 小时前
Easysearch 集群监控实战(下):线程池、索引、查询、段合并性能指标详解
前端·javascript·算法
一路往蓝-Anbo1 小时前
C语言从句柄到对象 (七) —— 给对象加把锁:RTOS 环境下的并发安全
java·c语言·开发语言·stm32·单片机·嵌入式硬件·算法
中國龍在廣州2 小时前
谈谈2025年人工智能现状及发展趋势分析
人工智能·深度学习·算法·自然语言处理·chatgpt·机器人·机器人学习
C雨后彩虹2 小时前
二维伞的雨滴效应
java·数据结构·算法·华为·面试
一路往蓝-Anbo2 小时前
C语言从句柄到对象 (八) —— 当对象会说话:观察者模式与事件链表
c语言·开发语言·数据结构·stm32·单片机·观察者模式·链表
youngee112 小时前
hot100-60子集
数据结构·算法
郝学胜-神的一滴2 小时前
Linux线程属性设置分离技术详解
linux·服务器·数据结构·c++·程序人生·算法