LeetCode211:Add and Search Word - Data structure design

原创 2015年07月06日 20:13:51

Design a data structure that supports the following two operations:

void addWord(word)
bool search(word)
search(word) can search a literal word or a regular expression string containing only letters a-z or .. A . means it can represent any one letter.

For example:

addWord(“bad”)
addWord(“dad”)
addWord(“mad”)
search(“pad”) -> false
search(“bad”) -> true
search(“.ad”) -> true
search(“b..”) -> true
Note:
You may assume that all words are consist of lowercase letters a-z.

Trie这种数据结构可以很方便的实现字符串的查找,它的时间复杂度只有O(L),根据最下面的提示单词中只有a-z的小写字母这个提示也可以想到使用Trie。
前面Trie的实现使用的递归实现的,这次尝试使用非递归实现。
基本的数据结构TrieNode也做了一些改变,因为不需要进行统计计数,只需要判断是否存在以某个节点结尾的字符串,所以使用一个标示量来判断是否存在以该字符结尾的字符串即可。
搜索字符串使用的是递归,要是没有’.’这个字符可能用非递归也比较好实现,但是加上’.’这个字符后用非递归想了会儿没想出了但是感觉用递归会很容易求解。
最后需要注意的是node节点的含义是字符的父节点,因为Trie树的根节点是一个空字符。
runtime:100ms

class WordDictionary {
public:
    class TrieNode
    {
        public:
        TrieNode * edges[26];//子节点
        bool end;//标示是否有以这个节点结尾的字符串
        TrieNode(){
            for(int i=0;i<26;i++)
            {
                edges[i]=NULL;
            }
            end=false;
        }
    };

    class Trie
    {
        public:
            Trie(){
                root=new TrieNode();
            }
            //添加单词使用循环实现,也可以使用递归,前面创建Trie树即使用的是递归
            void addWord(string word)
            {
                if(word.empty())
                    return ;

                TrieNode * node=root;
                int pos=0;
                while(pos<word.size())
                {
                    int char_code=word[pos]-'a';
                    if(node->edges[char_code]!=NULL)
                    {
                        node=node->edges[char_code];
                        pos++;
                    }
                    else
                    {
                        node->edges[char_code]=new TrieNode();
                        node=node->edges[char_code];
                        pos++;
                    }
                }
                node->end=true;
            }

            //搜索使用递归实现,要是没有'.'使用循环也很容易实现,但是加上限制条件后使用递归更容易一些
            bool search(string &word,int pos,TrieNode * node)
            {
                if(word.empty()&&node->end)
                    return true;

                int char_code=word[pos]-'a';
                if(pos==word.size()&&node->end)
                    return true;

                if(char_code=='.'-'a')
                {
                    for(int i=0;i<26;i++)
                        if(node->edges[i]!=NULL&&search(word,pos+1,node->edges[i]))
                            return true;
                }
                else 
                {
                    if(node->edges[char_code]!=NULL)
                        return search(word,pos+1,node->edges[char_code]);
                }
            }
          TrieNode * root;  

    };

    // Adds a word into the data structure.
    void addWord(string word) {
        trie.addWord(word);
    }

    // Returns if the word is in the data structure. A word could
    // contain the dot character '.' to represent any one letter.
    bool search(string word) {
        return trie.search(word,0,trie.root);
    }

    private:
       Trie trie;
};


// Your WordDictionary object will be instantiated and called as such:
// WordDictionary wordDictionary;
// wordDictionary.addWord("word");
// wordDictionary.search("pattern");

leetcode 211: Add and Search Word - Data structure design

Add and Search Word - Data structure design leetcode 211
  • xudli
  • xudli
  • 2015年05月19日 06:12
  • 6565

leetcode211 一点心得

这个题目跟208相似,但是其中有一个细节需要注意,让我纠结了半天。#include #include #includeusing namespace std;class DictNode{ publi...
  • hengyishu
  • hengyishu
  • 2015年07月24日 00:17
  • 681

Leetcode211 - Add and Search Word - Data structure design

我的新博客地址:HuHaoyu's Blog,最近新增了Jekyll的paginator分页功能和Swiftype的搜索引擎。欢迎参观!...
  • coderhuhy
  • coderhuhy
  • 2015年05月19日 19:55
  • 380

[LeetCode 211] Add and Search word -- Data Structure Design

Design a data structure that supports the following two operations:void addWord(word) bool search(wo...
  • sbitswc
  • sbitswc
  • 2015年08月25日 14:07
  • 795

Leetcode 211. Add and Search Word - Data structure design

Design a data structure that supports the following two operations:void addWord(word) bool search(w...
  • xinqrs01
  • xinqrs01
  • 2017年02月10日 05:33
  • 66

leetcode.211. Add and Search Word - Data structure design字典树

Design a data structure that supports the following two operations: void addWord(word) bool search(...
  • happyxuma1991
  • happyxuma1991
  • 2016年05月11日 15:21
  • 149

LeetCode 211 - Add and Search Word - Data structure design

一、问题描述 Description:Description: Design a data structure that supports the following two opera...
  • lisong694767315
  • lisong694767315
  • 2015年05月16日 10:12
  • 3231

Leetcode211: Populating Next Right Pointers in Each Node II

Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could b...
  • u013089961
  • u013089961
  • 2016年01月04日 11:29
  • 176

LeetCode 211. Add and Search Word - Data structure design

借用LeetCode 208. Implement Trie (Prefix Tree)中设计的字典树,特判查询字符为.时的情况即可。 注意: 成员变量的初始化应放在构造函数的initializi...
  • u014674776
  • u014674776
  • 2015年08月10日 10:50
  • 651

面试笔试杂项积累-leetcode 211-215

211.211-Add and Search Word - Data structure design-Difficulty: Medium Design a data structure th...
  • wolf96
  • wolf96
  • 2016年02月11日 22:49
  • 369
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode211:Add and Search Word - Data structure design
举报原因:
原因补充:

(最多只允许输入30个字)