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

yizhihongxing

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

题目描述

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

解题思路

这道题可以使用前缀树(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++实现KDTree 附完整代码

    对于“C++实现KDTree 附完整代码”的攻略,我会分为以下几个部分进行讲解: KDTree的基本概念和算法原理 KDTree的实现思路和整体代码结构 KDTree在实际应用中的应用场景 两个示例应用说明 KDTree基本概念和算法原理 KDTree全称是K-Dimensional Tree,即K维树,是一种便于高维空间数据检索的数据结构。其基本思路是对于…

    数据结构 2023年5月17日
    00
  • golang中set数据结构的使用示例

    Golang中Set数据结构的使用示例 Set是一种无序的、元素不重复的数据结构。通过使用map来实现,map中的key即为Set中的元素,value则可以用来存储某种状态(比如计数)。 Set数据结构的定义 type Set struct { m map[interface{}]bool } Set数据结构的初始化 func NewSet() *Set {…

    数据结构 2023年5月17日
    00
  • C语言数据结构之 折半查找实例详解

    C语言数据结构之 折半查找实例详解 什么是折半查找? 折半查找是一种在有序数组中查找某个特定元素的算法。其基本思想是将查找的值与数组的中间元素比较,如果比中间元素小,则在数组的左半部分查找;如果比中间元素大,则在数组的右半部分查找,直到找到该元素或查找范围为空。 折半查找算法的流程 确定要查找的数组arr和其元素个数n,以及要查找的元素value。 设定左边…

    数据结构 2023年5月17日
    00
  • 一文吃透JS树状结构的数据处理(增删改查)

    一文吃透JS树状结构的数据处理(增删改查) 什么是树状结构 树状结构是一种经典的数据结构,在计算机领域中被广泛应用。树状结构由连通的节点组成,节点之间形成父子关系。一根树状结构的“根节点”没有父节点,每个子节点可以有多个“子节点”,但一个“子节点”只能有一个“父节点”。常见的应用包括文件系统、HTML DOM 和 JSON 数据格式等。 数据结构设计 我们以…

    数据结构 2023年5月17日
    00
  • JavaScript的Set数据结构详解

    JavaScript中的Set数据结构详解 什么是Set? Set 是一种 Javascript 内置的数据结构。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,可以通过new关键字来创建 Set 数据结构。 let mySet = new Set(); Set的基本用法 Set实例对象有以下常用方法: add(value):…

    数据结构 2023年5月17日
    00
  • Java 详细分析四个经典链表面试题

    Java 详细分析四个经典链表面试题 简介 链表是数据结构中非常常见的一种形式,在Java中也有非常多的实现方式。本文将介绍Java中四个经典的链表面试题,并且详细分析它们的实现方法。在介绍每一个题目的详细实现之前,我们将简单介绍Java链表和链表常见操作。 Java链表 链表是一种线性结构,其中每个节点包含了一个数据域和一个指针域,指向下一个节点。Java…

    数据结构 2023年5月17日
    00
  • 浅谈iOS 数据结构之链表

    浅谈iOS 数据结构之链表 在计算机科学中,链表是一种数据结构,用于存储一系列按顺序排列的元素。链表的一个关键点是它不需要连续的内存空间来存储元素,相反,每个元素由一个指向下一个元素的指针组成。在iOS开发中,链表在各种场景下都有所应用,如UITableView和UICollectionView的数据源等。本文将详细讲解链表的基本知识和使用技巧。 链表的基本…

    数据结构 2023年5月17日
    00
  • C语言数据结构之单链表存储详解

    C语言数据结构之单链表存储详解 什么是单链表 链表是一种非顺序存储的数据结构,其每个节点都保存下一个节点的地址。单链表是最简单的链表,每个节点只包含下一个节点的地址。 单链表节点的定义 单链表的节点定义一般包括两个部分:数据域和指针域。数据域存放节点的数据,指针域存放下一个节点的地址。 以下是单链表节点的定义: typedef struct node { i…

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