File tree Expand file tree Collapse file tree 2 files changed +86
-0
lines changed
design-add-and-search-words-data-structure Expand file tree Collapse file tree 2 files changed +86
-0
lines changed Original file line number Diff line number Diff line change
1
+ class WordDictionary :
2
+
3
+ def __init__ (self ):
4
+ self .root = {"$" : True }
5
+
6
+
7
+ # TC: O(W), SC: O(W)
8
+ def addWord (self , word : str ) -> None :
9
+ node = self .root
10
+ for ch in word :
11
+ if ch not in node : # 글자가 node에 없으면
12
+ node [ch ] = {"$" : False } # 아직 끝이 아님 표시
13
+ node = node [ch ] # 자식 노드로 변경
14
+ node ["$" ] = True # 단어 끝 표시
15
+
16
+
17
+ # TC: O(26^W) => 최악의 경우 영어 알파벳 26개가 각 노드에서 다음 글자가 됨 * 글자수의 비례해서 호출 스택 깊어짐, SC: O(W)
18
+ def search (self , word : str ) -> bool :
19
+ def dfs (node , idx ):
20
+ if idx == len (word ):
21
+ return node ["$" ]
22
+
23
+ ch = word [idx ]
24
+ if ch in node :
25
+ return dfs (node [ch ], idx + 1 )
26
+ if ch == "." : # 글자가 .이라면
27
+ # 노드의 모든 자식 노드 호출 (어느 경로에서 글자가 일치할지 모르기 때문)
28
+ if any (dfs (node [k ], idx + 1 ) for k in node if k != '$' ):
29
+ return True
30
+ return False
31
+
32
+ return dfs (self .root , 0 ) # 최상위 노드, 최초 idx
33
+
34
+
35
+ # Your WordDictionary object will be instantiated and called as such:
36
+ # obj = WordDictionary()
37
+ # obj.addWord(word)
38
+ # param_2 = obj.search(word)
Original file line number Diff line number Diff line change
1
+ class WordDictionary {
2
+ root : Record < string , any > ;
3
+
4
+ constructor ( ) {
5
+ this . root = { $ : true } ;
6
+ }
7
+
8
+ addWord ( word : string ) : void {
9
+ let node = this . root ;
10
+ for ( const ch of word ) {
11
+ if ( ! ( ch in node ) ) {
12
+ node [ ch ] = { $ : false } ;
13
+ }
14
+ node = node [ ch ] ;
15
+ }
16
+ node [ "$" ] = true ;
17
+ }
18
+
19
+ search ( word : string ) : boolean {
20
+ const dfs = ( node : Record < string , any > , idx : number ) : boolean => {
21
+ if ( idx === word . length ) return node [ "$" ] ;
22
+
23
+ const ch = word [ idx ] ;
24
+ if ( ch === "." ) {
25
+ for ( const key in node ) {
26
+ if ( key !== "$" && dfs ( node [ key ] , idx + 1 ) ) {
27
+ return true ;
28
+ }
29
+ }
30
+ return false ;
31
+ }
32
+
33
+ if ( ch in node ) {
34
+ return dfs ( node [ ch ] , idx + 1 ) ;
35
+ }
36
+
37
+ return false ;
38
+ } ;
39
+ return dfs ( this . root , 0 ) ;
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Your WordDictionary object will be instantiated and called as such:
45
+ * var obj = new WordDictionary()
46
+ * obj.addWord(word)
47
+ * var param_2 = obj.search(word)
48
+ */
You can’t perform that action at this time.
0 commit comments