[hihoCoder] Trie树

简介: This is a application of the Trie data structure, with minor extension. The critical part in this problem is to count all the words that have a partic...

This is a application of the Trie data structure, with minor extension. The critical part in this problem is to count all the words that have a particualr prefix and the problem has given nice hints to make this extension.

Two functions require to be implemented: add a word to the Trie and search the Trie for all words with a particular prefix.

The code is as follows.

If you are not familiar with Trie, you may refer to this solution first to get the basic idea of it.

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class TrieNode {
 6 public:
 7     int count;
 8     TrieNode* children[26];
 9     TrieNode() {
10         count = 0;
11         for (int i = 0; i < 26; i++)
12             children[i] = NULL;
13     }
14 };
15 
16 class Dictionary {
17 public:
18     Dictionary() {
19         root = new TrieNode();
20     }
21     
22     void insert(char* word) {
23         TrieNode* run = root;
24         for (int i = 0; word[i]; i++) {
25             if (!(run -> children[word[i] - 'a']))
26                 run -> children[word[i] - 'a'] = new TrieNode();
27             run = run -> children[word[i] - 'a'];
28             run -> count++;
29         }
30     }
31     
32     int search(char* prefix) {
33         TrieNode* run = root;
34         for (int i = 0; prefix[i]; i++) {
35             if (run)
36                 run = run -> children[prefix[i] - 'a'];
37             else break;
38         }
39         if (!run) return false;
40         return run -> count;
41     }
42     
43 private:
44     TrieNode* root;
45 };
46 
47 int main(void) {
48     int dictSize;
49     while (scanf("%d", &dictSize) != EOF) {
50         Dictionary dictionary;
51         char word[20];
52         for (int i = 0; i < dictSize; i++) {
53             scanf("%s", word);
54             dictionary.insert(word);
55         }
56         int querySize;
57         scanf("%d", &querySize);
58         char prefix[20];
59         for (int i = 0; i < querySize; i++) {
60             scanf("%s", prefix);
61             printf("%d\n", dictionary.search(prefix));
62         }
63     }
64     return 0;
65 }
目录
相关文章
|
算法 Android开发
LeetCode 周赛上分之旅 #48 一道简单的树上动态规划问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
72 1
|
算法 Android开发 索引
LeetCode 周赛上分之旅 #44 同余前缀和问题与经典倍增 LCA 算法
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
87 0
|
8月前
|
API
【二叉树】练习题终章
【二叉树】练习题终章
55 0
校门外的树(三种解法,非直接暴力)
校门外的树(三种解法,非直接暴力)
|
算法 测试技术 Android开发
LeetCode 周赛上分之旅 # 36 KMP 字符串匹配殊途同归
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
87 0
|
算法 Android开发
LeetCode 周赛上分之旅 #34 按部就班地解决动态规划问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
76 0
|
人工智能 算法 容器
从六道leetcode题掌握双指针
双指针从广义上来说,是指用两个变量在线性结构上遍历而解决的问题。狭义上说, 对于数组,指两个变量在数组上相向移动解决的问题; 对于链表,指两个变量在链表上同向移动解决的问题,也称为「快慢指针」问题。 双指针算法通常不难,双指针算法是基于暴力解法的优化,它们是很好的学习算法的入门问题
|
算法 程序员
【算法集训 | 暑期刷题营】8.2题---暴力递归之深搜
【算法集训 | 暑期刷题营】8.2题---暴力递归之深搜
【算法集训 | 暑期刷题营】8.2题---暴力递归之深搜
|
存储 机器人 Java
肝了好多天-动态规划十连-超细腻解析
【刷题打卡】周末肝了几道动态规划题,写一下我的心得笔记,故事开头,文章循序渐进,如果看官出现头疼不适,望休息,但是别放弃一定要看完!号外:每道题都有单元测试,看官们直接copy就可以debug了。
140 0
|
算法 Kotlin
请收下今日份的编程技巧速递(二分查找和递归)
请收下今日份的编程技巧速递(二分查找和递归)
请收下今日份的编程技巧速递(二分查找和递归)