码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Add and Search Word - Data structure design (trie树)

时间:2015-05-18 14:27:46      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

 

技术分享

 

题意:实现添加单词和查找单词的作用,即实现字典功能。

思路:‘.‘ 可以代表一个任何小写字母,可能是".abc"或者"a.bc"或者"abc.",能应对这三种就没有问题了。在每个单词的尾字母上标上tag=1,代表从树根到此节点有一个单词。暂时想不到更快的办法。

 

技术分享
 1 class WordDictionary {
 2 public:
 3     WordDictionary(){
 4         tree=create();
 5     }
 6     void addWord(string word) {
 7         node *tmp=tree;
 8         node *p=0;    //负责创建结点
 9         for(int i=0; i<word.size(); i++)
10         {
11             if(!tmp->next[word[i]-a])    //没有这个分支,创建它
12             {
13                 p=create();
14                 tmp->next[word[i]-a]=p;
15             }
16             tmp=tmp->next[word[i]-a];    //往下走
17         }
18         tmp->tag=1;
19     }
20 
21     bool search(string word) {
22         if(DFS(tree,word.c_str())==true)//
23             return true;
24         return false;
25     }
26 private:
27 
28     struct node
29     {
30         bool tag;
31         node *next[26];
32 
33     };
34     node *tree;//先建立树根
35     node *create()
36     {
37         node *tmp=new(node);
38         tmp->tag=0;
39         for(int i=0; i<26; i++)
40             tmp->next[i]=0;
41         return tmp;
42     }
43     bool DFS(node *t,const char *p)
44     {
45         if(*(p+1)==\0)
46         {
47             if(*p==.) //‘.‘刚好是最后一个
48             {
49                 for(int i=0; i<26; i++)
50                     if(t->next[i]&&t->next[i]->tag==1)
51                         return true;
52                 return false;   //无匹配
53             }
54             if(t->next[*p-a] && t->next[*p-a]->tag==1)    return 1;
55             return false;
56         }
57 
58         if(*p==.)//要搜索全部
59         {
60             for(int i=0; i<26; i++)
61                 if( t->next[i] && DFS(t->next[i],p+1) )
62                     return true;
63             return false;
64         }
65 
66         if( t->next[*p-a] && DFS(t->next[*p-a],p+1))
67             return true;
68         return false;
69     }
70 };
71 
72 
73 // Your WordDictionary object will be instantiated and called as such:
74 // WordDictionary wordDictionary;
75 // wordDictionary.addWord("word");
76 // wordDictionary.search("pattern");
AC代码

 

LeetCode Add and Search Word - Data structure design (trie树)

标签:

原文地址:http://www.cnblogs.com/xcw0754/p/4511682.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!