已知n个由小写字母构成的平均长度为10的单词,判断其中是否存在某个串为另一个串的前缀子串。下面对比3种方法:
1.
2.
3.
解释一下hash为什么不能将建立与查询同时执行,例如有串:911,911456输入,如果要同时执行建立与查询,过程就是查询911,没有,然后存入9、91、911,查询911456,没有然后存入9114、91145、911456,而程序没有记忆功能,并不知道911在输入数据中出现过。所以用hash必须先存入所有子串,然后for循环查询。
而trie树便可以,存入911后,已经记录911为出现的字符串,在存入911456的过程中就能发现而输出答案;倒过来亦可以,先存入911456,在存入911时,当指针指向最后一个1时,程序会发现这个1已经存在,说明911必定是某个字符串的前缀,
trie树的简单实现:
#include
10
11
12
13
14
15
16};
17
18class
20public:
21
25private:
26
28
29Trie::Trie()
30{
31
33
34void
36
38
39
40
41
45
46
47
48}
49
50bool
51{
52
55
56
57
58
59}
60
61void
62{
63
64
65
67
68
69
70
72
73void
74{
75
78
79
81
82
83}