File tree Expand file tree Collapse file tree 1 file changed +72
-0
lines changed Expand file tree Collapse file tree 1 file changed +72
-0
lines changed Original file line number Diff line number Diff line change 1+ /**
2+ * Question Link: https://leetcode.com/problems/search-suggestions-system/
3+ * Primary idea: Use trie to add and search prefix (DFS).
4+ *
5+ * Time Complexity: O(n), Space Complexity: O(n)
6+ *
7+ */
8+
9+ class SearchSuggestionsSystem {
10+ func suggestedProducts( _ products: [ String ] , _ searchWord: String ) -> [ [ String ] ] {
11+ let trie = Trie ( )
12+ var res = [ [ String] ] ( )
13+
14+ products. forEach { trie. insert ( $0) }
15+
16+ return ( 1 ... searchWord. count) . map { trie. searchWords ( for: String ( searchWord. prefix ( $0) ) ) }
17+ }
18+
19+ private class Trie {
20+ let root = TrieNode ( )
21+
22+ func insert( _ word: String ) {
23+ var node = root
24+
25+ for char in word {
26+ if node. charNodeMap [ char] == nil {
27+ node. charNodeMap [ char] = TrieNode ( )
28+ }
29+
30+ node = node. charNodeMap [ char] !
31+ }
32+
33+ node. isWord = true
34+ }
35+
36+ func searchWords( for term: String ) -> [ String ] {
37+ var res = [ String] ( ) , node = root
38+
39+ for char in term {
40+ guard let next = node. charNodeMap [ char] else {
41+ return res
42+ }
43+
44+ node = next
45+ }
46+
47+ dfs ( & res, term, node)
48+
49+ return Array ( res. sorted ( ) . prefix ( 3 ) )
50+ }
51+
52+ private func dfs( _ res: inout [ String ] , _ path: String , _ node: TrieNode ) {
53+ if node. isWord {
54+ res. append ( path)
55+ }
56+
57+ for (char, next) in node. charNodeMap {
58+ dfs ( & res, path + String( char) , next)
59+ }
60+ }
61+ }
62+
63+ private class TrieNode {
64+ var isWord : Bool
65+ var charNodeMap : [ Character : TrieNode ]
66+
67+ init ( ) {
68+ isWord = false
69+ charNodeMap = [ Character: TrieNode] ( )
70+ }
71+ }
72+ }
You can’t perform that action at this time.
0 commit comments