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日

相关文章

  • 数据结构 双向链表的创建和读取详解及实例代码

    下面我为你详细讲解“数据结构 双向链表的创建和读取详解及实例代码”的完整攻略。 什么是双向链表? 双向链表是一种常见的线性数据结构,与单向链表相比,它可以在节点之间建立双向连接,使得在需要反向遍历链表时效率更高。每个节点同时保存了指向前一个节点和后一个节点的指针,因此双向链表也叫做双链表。 双向链表的创建 定义节点类 首先,我们需要定义一个表示节点的类,该类…

    数据结构 2023年5月16日
    00
  • C语言数据结构不挂科指南之线性表详解

    C语言数据结构不挂科指南之线性表详解 本篇攻略将为大家介绍C语言数据结构中的线性表,包括定义、实现和应用。希望能够为初学者提供帮助,让大家轻松学习和掌握线性表的相关知识。 一、线性表的定义 线性表是由一组元素构成的有限序列,其中每个元素可以有零个或一个前驱元素,也可以有零个或一个后继元素。线性表通常用于存储和处理具有相同类型的数据元素。 线性表的实现方式有多…

    数据结构 2023年5月17日
    00
  • Leetcode Practice — 栈和队列

    目录 155. 最小栈 思路解析 20. 有效的括号 思路解析 1047. 删除字符串中的所有相邻重复项 思路解析 1209. 删除字符串中的所有相邻重复项 II 思路解析 删除字符串中出现次数 >= 2 次的相邻字符 剑指 Offer 09. 用两个栈实现队列 239. 滑动窗口最大值 思路解析 155. 最小栈 设计一个支持 push ,pop ,…

    算法与数据结构 2023年4月17日
    00
  • Huffman实现

    Huffman编码树 秒懂:【算法】Huffman编码_哔哩哔哩_bilibili 约定:字符x的编码长度 就是其对应叶节点的深度; 在一个字符集中,每个字符出现的次数有多有少,那么若都采用固定长度编码的话,那么编码长度会非常大,并且搜索时间复杂度都非常高;若采用非固定编码,出现次数多的字符编码长度小一些,并且放在树深度小的地方,提高搜索时间效率;这样带权平…

    算法与数据结构 2023年4月17日
    00
  • JavaScript数据结构与算法

    JavaScript数据结构与算法完整攻略 什么是数据结构与算法 数据结构和算法是计算机科学的重要组成部分,常用于解决数据处理问题的方法与技术。数据结构是指存储和组织数据的方式,而算法则是解决数据处理问题的途径和方法。 数据结构分类 数据结构可分为以下几类: 数组 —— 存储有序元素集合的线性结构; 栈 —— 一种后进先出的数据结构; 队列 —— 一种先进先…

    数据结构 2023年5月17日
    00
  • Python中的函数式编程:不可变的数据结构

    Python是一门支持函数式编程的语言。相比于传统的命令式编程,函数式编程更加强调数据的不可变性。本文将介绍如何在Python中使用不可变的数据结构实现函数式编程。 什么是不可变的数据结构? 不可变数据结构是指一旦创建就无法改变的数据结构。在Python中,元组(tuple)是一个典型的不可变数据结构。以下是一个创建元组的示例代码: a_tuple = (1…

    数据结构 2023年5月17日
    00
  • 「分治」黑白棋子的移动

    本题为3月23日23上半学期集训每日一题中A题的题解 题面 题目描述 有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能…

    算法与数据结构 2023年4月18日
    00
  • C语言线性表顺序存储结构实例详解

    C语言线性表顺序存储结构实例详解 线性表的定义 线性表是数据结构中最基本的结构之一。它们是由相同数据类型的一组数据元素组成的序列。线性表具有唯一的首元素和唯一的末元素,除第一个元素之外的每个元素都有唯一的前继,除最后一个元素之外的每个元素都有唯一的后继。 线性表的存储方式 线性表有两种存储方式: 顺序存储和链式存储。 顺序存储采用一段连续的内存空间来存储线性…

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