1
- // Trie trie = new Trie();
2
-
3
- // trie.insert("apple");
4
- // trie.search("apple"); // returns true
5
- // trie.search("app"); // returns false
6
- // trie.startsWith("app"); // returns true
7
- // trie.insert("app");
8
- // trie.search("app"); // returns true
9
-
10
1
class TrieNode {
11
- private isEnd : boolean = false ;
12
- private freq : number = 0 ;
13
- private child : object = { } ;
2
+ public root : object = { } ;
14
3
public constructor ( ) {
15
- this . isEnd = false ;
16
- this . freq = 0 ;
17
- this . child = { } ;
4
+ this . root ;
18
5
}
19
6
}
20
7
21
8
class Trie extends TrieNode {
22
- public root : TrieNode = undefined ;
23
- constructor ( trie ) {
9
+ public root = undefined ;
10
+ public constructor ( ) {
24
11
super ( ) ;
25
- this . root = new TrieNode ( ) ;
12
+ this . root = new TrieNode ( ) . root ;
26
13
}
27
14
28
15
/**
@@ -31,48 +18,47 @@ class Trie extends TrieNode {
31
18
* @return {void }
32
19
*/
33
20
public insert ( word : string ) : void {
34
- if ( word . length ) return ;
35
- let letter : TrieNode = new TrieNode ( ) ;
36
- let curNode : TrieNode = new TrieNode ( ) ;
37
- let i : number = 0 ;
38
-
39
- while ( i < word . length ) {
40
- letter = word [ i ] ;
41
- if ( ! curNode . child . hadOwnProperty ( letter ) ) {
42
- curNode . child [ letter ] = new TrieNode ( ) ;
43
- }
44
- curNode = curNode . child [ letter ] ;
21
+ let node = this . root ;
22
+ for ( let i = 0 ; i < word . length ; i ++ ) {
23
+ node = node [ word [ i ] ] = node [ word [ i ] ] || { } ;
24
+ if ( i === word . length - 1 ) node . isTerminal = true ;
45
25
}
46
-
47
- curNode . isEnd = true ;
48
- curNode . freq += 1 ;
49
26
}
50
27
51
28
/**
52
29
* Returns if the word is in the trie.
53
30
* @param {string } word
54
31
* @return {boolean }
55
32
*/
56
- public search ( word : string ) : boolean { }
33
+ public search ( word : string , isPrefix ?: boolean ) : boolean {
34
+ let node = this . root ;
35
+ for ( let c of word ) {
36
+ if ( ! node [ c ] ) return false ;
37
+ node = node [ c ] ;
38
+ }
39
+ return isPrefix || ! ! node . isTerminal ;
40
+ }
57
41
58
42
/**
59
43
* Returns if there is any word in the trie that starts with the given prefix.
60
44
* @param {string } prefix
61
45
* @return {boolean }
62
46
*/
63
- public startsWith ( prefix ) { }
64
-
65
- public prefix ( word ) {
66
- let letter : TrieNode = new TrieNode ( ) ;
67
- let curNode : TrieNode = new TrieNode ( ) ;
68
- let i : number = 0 ;
69
-
70
- while ( i < word . length ) {
71
- letter = word [ i ] ;
72
- if ( ! curNode . child . hasOwnProperty ( letter ) ) {
73
- return null ;
74
- curNode = curNode . child [ letter ] ;
75
- }
76
- }
47
+ public startsWith ( prefix : string ) : boolean {
48
+ return this . search ( prefix , true ) ;
77
49
}
78
50
}
51
+
52
+ const trie = new Trie ( ) ;
53
+
54
+ trie . insert ( 'apple' ) ;
55
+ const a = trie . search ( 'apple' ) ; // returns true
56
+ const b = trie . search ( 'app' ) ; // returns false
57
+ const c = trie . startsWith ( 'app' ) ; // returns true
58
+ trie . insert ( 'app' ) ;
59
+ const d = trie . search ( 'app' ) ; // returns true
60
+
61
+ console . log ( 'a' , a ) ;
62
+ console . log ( 'b' , b ) ;
63
+ console . log ( 'c' , c ) ;
64
+ console . log ( 'd' , d ) ;
0 commit comments