C++实现LeetCode(211.添加和查找单词-数据结构设计)

首先,我们需要先了解一下题目的要求和限制,以及具体的解题思路。

题目描述

设计一个支持添加、删除、查找单词的数据结构。添加和删除单词的操作需要支持普通词和通配符'.'。查找单词只支持普通词,不支持通配符'.'。所有单词都是非空的。

解题思路

这道题可以使用前缀树(Trie树)来实现。

首先,我们需要定义一个单词类,它包含两个字段:单词字符串和单词长度。然后,我们需要构建一个前缀树,每个节点包含一个字母和指向下一层节点的指针数组。在添加单词时,我们需要把单词的每个字母插入到前缀树中。如果遇到通配符'.',则需要把当前节点的全部子节点都加入到搜索列表中。

在查找单词时,我们需要从根节点开始遍历前缀树,一边遍历一边比对单词的每个字母。如果遇到通配符'.',则需要在搜索列表中搜索。如果最后遍历到的节点是一个单词节点,则说明存在该单词。

Code

下面是C++的完整代码。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Word {
public:
    string str;
    int len;
    Word(string s) {
        str = s;
        len = s.length();
    }
};

class TrieNode {
public:
    TrieNode* next[26];
    vector<int> words;
    TrieNode() {
        for (int i = 0; i < 26; i++) {
            next[i] = nullptr;
        }
    }
};

class WordDictionary {
public:
    TrieNode* root;
    WordDictionary() {
        root = new TrieNode();
    }

    void addWord(string word) {
        TrieNode* p = root;
        for (int i = 0; i < word.length(); i++) {
            int index = word[i] - 'a';
            if (p->next[index] == nullptr) {
                p->next[index] = new TrieNode();
            }
            p = p->next[index];
            p->words.push_back(i);
        }
    }

    bool search(string word) {
        Word w(word);
        return dfs(w, 0, root);
    }

    bool dfs(Word& word, int pos, TrieNode* node) {
        if (pos == word.len) {
            return node != nullptr && !node->words.empty();
        }
        if (word.str[pos] == '.') {
            for (int i = 0; i < 26; i++) {
                if (node->next[i] != nullptr) {
                    if (dfs(word, pos + 1, node->next[i])) {
                        return true;
                    }
                }
            }
        } else {
            int index = word.str[pos] - 'a';
            if (node->next[index] != nullptr) {
                if (dfs(word, pos + 1, node->next[index])) {
                    return true;
                }
            }
        }
        return false;
    }
};

int main() {
    WordDictionary wd;
    string word1 = "bad";
    string word2 = "dad";
    string word3 = "mad";
    wd.addWord(word1);
    wd.addWord(word2);
    wd.addWord(word3);
    cout << wd.search("pad") << endl;  // return false
    cout << wd.search("bad") << endl;  // return true
    cout << wd.search(".ad") << endl;  // return true
    cout << wd.search("b..") << endl;  // return true
    cout << wd.search("bda") << endl;  // return false
    return 0;
}

示例说明

示例1:

输入:
WordDictionary wd;
wd.addWord("bad");
wd.addWord("dad");
wd.addWord("mad");
wd.search("pad");
wd.search("bad");
wd.search(".ad");
wd.search("b..");
wd.search("bda");
输出:
false
true
true
true
false

示例2:

输入:
WordDictionary wd;
wd.addWord("apple");
wd.search("apple");   // 返回 true
wd.search("app");     // 返回 false
wd.addWord("app");
wd.search("app");     // 返回 true
输出:
true
false
true

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(211.添加和查找单词-数据结构设计) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言数据结构与算法之排序总结(二)

    C语言数据结构与算法之排序总结(二) 本篇文章是关于C语言数据结构与算法中排序算法的详细讲解,涉及了八种排序算法。 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。在排序过程中,它会重复地交换相邻的元素,这是它名称的由来。 示例代码: c void bubble_sort(int arr[], int n) { for (int i = 0…

    数据结构 2023年5月17日
    00
  • C语言单链队列的表示与实现实例详解

    C语言单链队列的表示与实现实例详解 什么是队列? 在计算机科学中,队列(Queue)是一种特殊的数据结构,它只允许在一端进行插入操作,在另一端进行删除操作。将新元素插入队列的过程可以称之为入队,而将元素从队列中删除的过程则可以称之为出队。队列的核心思想是“先进先出”(First In First Out,FIFO),即先入队的元素先出队。 单链队列的表示方式…

    数据结构 2023年5月17日
    00
  • 比特币区块链的数据结构

    让我来为你详细讲解比特币区块链的数据结构。 1. 区块链的定义 比特币区块链是一个去中心化的、可追溯的、公共的、可验证的交易数据库。每一笔交易都通过哈希算法,与之前的交易连接成一个区块,形成了一个数据结构链,也就是“区块链”。 2. 区块链的数据结构 区块链的数据结构由区块、交易和哈希三部分组成: 区块 区块是区块链数据结构的基本单位,每一个区块代表着一段时…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之插入排序示例详解

    Go语言数据结构之插入排序示例详解 什么是插入排序? 插入排序是一种简单直观的排序方法,其基本思想是将一个待排序的序列分成已排序和未排序两部分,从未排序的部分中选择一个元素插入到已排序部分的合适位置,直到所有元素都被插入到已排序部分为止。 插入排序示例 示例1 我们来看一个数字序列的插入排序示例: package main import "fmt&…

    数据结构 2023年5月17日
    00
  • java实现队列数据结构代码详解

    Java实现队列数据结构代码详解 1. 队列数据结构简介 队列(Queue)是一种先进先出(FIFO)的数据结构,支持在一端插入元素,在另一端删除元素并返回删除的元素。其操作包括入队(enqueue)和出队(dequeue)。 2. 队列实现方法 队列可以通过数组或链表来实现。其中,数组实现的队列称为顺序队列,链表实现的队列称为链式队列。 2.1 顺序队列 …

    数据结构 2023年5月17日
    00
  • R语言数据结构之矩阵、数组与数据框详解

    R语言数据结构之矩阵、数组与数据框详解 在R语言中,矩阵、数组和数据框是常见的数据结构。本文将从定义、创建、访问和操作等方面详细讲解这些数据结构。 矩阵(matrix) 定义 矩阵是R语言中的一种二维数据结构,所有的元素都必须是同一类型的,并且矩阵中的行列数必须相同。矩阵可以使用matrix函数创建。 创建 # 创建一个3行4列的矩阵,所有元素都为0 mat…

    数据结构 2023年5月17日
    00
  • 数据结构Typescript之哈希表实现详解

    数据结构Typescript之哈希表实现详解 什么是哈希表 哈希表(Hash Table)又称为散列表,是一种根据关键字(Key)直接访问内存存储位置的数据结构。通俗的解释就是利用一个哈希函数(Hash Function)将关键字映射到哈希表中的一个位置(索引)来进行访问,从而快速、高效地查找、插入、删除元素。 哈希表的实现 本文将介绍使用Typescrip…

    数据结构 2023年5月17日
    00
  • C语言结构体struct详解

    C语言结构体struct详解 什么是结构体? 在C语言中,结构体是一种用户自定义的数据类型,它可以将不同的数据类型组合在一起形成一个新的数据类型。结构体主要由结构体名、成员和符号构成。 使用结构体可以方便地定义一些复杂的数据类型,例如表示一个学生信息的数据类型,可以包括姓名、学号、性别、年龄等信息。 结构体的定义和声明 结构体的定义通常放在函数外部,以便在整…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部