• 【Leetcode】211. 添加与搜索单词 - 数据结构设计


    一、题目

    1、题目描述

    请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。

    实现词典类 WordDictionary

    • WordDictionary() 初始化词典对象
    • void addWord(word)word 添加到数据结构中,之后可以对它进行匹配
    • bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回 falseword 中可能包含一些 '.' ,每个 . 都可以表示任何一个字母。

    示例:

    输入:
    ["WordDictionary","addWord","addWord","addWord","search","search","search","search"]
    [[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]]
    输出:
    [null,null,null,null,false,true,true,true]
    
    解释:
    WordDictionary wordDictionary = new WordDictionary();
    wordDictionary.addWord("bad");
    wordDictionary.addWord("dad");
    wordDictionary.addWord("mad");
    wordDictionary.search("pad"); // 返回 False
    wordDictionary.search("bad"); // 返回 True
    wordDictionary.search(".ad"); // 返回 True
    wordDictionary.search("b.."); // 返回 True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    提示:

    • 1 <= word.length <= 25
    • addWord 中的 word 由小写英文字母组成
    • search 中的 word'.' 或小写英文字母组成
    • 最多调用 104addWordsearch

    2、基础框架

    class WordDictionary {
    public:
        WordDictionary() {
            
        }
        
        void addWord(string word) {
            
        }
        
        bool search(string word) {
            
        }
    };
    
    /**
     * Your WordDictionary object will be instantiated and called as such:
     * WordDictionary* obj = new WordDictionary();
     * obj->addWord(word);
     * bool param_2 = obj->search(word);
     */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3、原题链接

    211. 添加与搜索单词 - 数据结构设计

    二、解题报告

    1、思路分析

    主要思路同【Leetcode】208.实现Trie(前缀树),但是需要注意,插入的时候只有小写字母字符,而查找的时候有"."和小写字母字符,所以遇到 “.” 字符时,所有子孩子非空的情况都要进行尝试。

    2、时间复杂度

    3、代码详解

    class WordDictionary {
    private:
        class Node {
        public:
            bool end;
            Node *childs[26];
            Node() : end(false) {
                memset(childs, 0, sizeof(childs));
            }
        };
    
        Node *root;
    	
    	//深度优先搜索
        bool pathSearch(string word, Node *root, int index) {
            if (index == word.size()) {
                return root->end;
            }
    
            Node *node = root;
            int path = 0;
            
            
            if (word[index] == '.') { //字符.
                for (int i = 0; i < 26; i++) { //所有非空的孩子都要尝试
                    if (node->childs[i]) {
                        bool res = pathSearch(word, node->childs[i], index + 1);
                        if (res) return true;
                    }
                }
                return false;
            } else { //字母字符
                path = word[index] - 'a';
                if (node->childs[path] == nullptr) {
                    return false;
                }
                return pathSearch(word, node->childs[path], index + 1);
            }
            
        }
    public:
        WordDictionary() {
            root = new Node();
        }
        
        void addWord(string word) {
            Node *node = root;
            int path = 0;
            for (int i = 0; word[i]; i++) {
                path = word[i] - 'a';
                if (node->childs[path] == nullptr) {
                    node->childs[path] = new Node();
                }
                node = node->childs[path];
            }
            node->end = true;
        }
    
    
        bool search(string word) {
            return pathSearch(word, root, 0);
        }
    };
    
    /**
     * Your WordDictionary object will be instantiated and called as such:
     * WordDictionary* obj = new WordDictionary();
     * obj->addWord(word);
     * bool param_2 = obj->search(word);
     */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
  • 相关阅读:
    [FAQ19892]如何配置为UFS的项目
    医疗产品方案|智能蓝牙血压计方案
    UE4 回合游戏项目 23- 进入战斗
    计算机毕业设计Python+djang企业it资产管理系统(源码+系统+mysql数据库+Lw文档)
    记录“在Unity动画播放协程内等待动画播放完成时回调”遇到的坑
    信息安全软考——第三章 密码学基本理论笔记 很全呀!
    若依框架前后端分离版v3.8.3使用代码生成工具生成的接口无法通过swagger访问
    BIT-5-操作符详解(C语言初阶学习)
    【笔记 Pytorch】模型网络结构、网络参数可视化
    免杀技术,你需要学习哪些内容
  • 原文地址:https://blog.csdn.net/u011386173/article/details/133819879