Skip to content

Commit ed2c85c

Browse files
authored
feat: add swift implementation to lcci problem: No.17.17 (doocs#2804)
1 parent bb01264 commit ed2c85c

File tree

3 files changed

+207
-0
lines changed

3 files changed

+207
-0
lines changed

lcci/17.17.Multi Search/README.md

+70
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,76 @@ func multiSearch(big string, smalls []string) [][]int {
246246
}
247247
```
248248

249+
```swift
250+
class TrieNode {
251+
var idx: Int
252+
var children: [TrieNode?]
253+
254+
init() {
255+
self.idx = -1
256+
self.children = Array(repeating: nil, count: 26)
257+
}
258+
}
259+
260+
class Trie {
261+
private let root: TrieNode
262+
263+
init() {
264+
self.root = TrieNode()
265+
}
266+
267+
func insert(_ word: String, _ index: Int) {
268+
var node = root
269+
for ch in word {
270+
let i = Int(ch.asciiValue! - Character("a").asciiValue!)
271+
if node.children[i] == nil {
272+
node.children[i] = TrieNode()
273+
}
274+
node = node.children[i]!
275+
}
276+
node.idx = index
277+
}
278+
279+
func search(_ word: String) -> [Int] {
280+
var node = root
281+
var results = [Int]()
282+
for ch in word {
283+
let i = Int(ch.asciiValue! - Character("a").asciiValue!)
284+
if node.children[i] == nil {
285+
break
286+
}
287+
node = node.children[i]!
288+
if node.idx != -1 {
289+
results.append(node.idx)
290+
}
291+
}
292+
return results
293+
}
294+
}
295+
296+
class Solution {
297+
func multiSearch(_ big: String, _ smalls: [String]) -> [[Int]] {
298+
let trie = Trie()
299+
for (index, small) in smalls.enumerated() {
300+
trie.insert(small, index)
301+
}
302+
303+
var results = Array(repeating: [Int](), count: smalls.count)
304+
let bigChars = Array(big)
305+
306+
for i in 0..<bigChars.count {
307+
let substring = String(bigChars[i...])
308+
let indices = trie.search(substring)
309+
for index in indices {
310+
results[index].append(i)
311+
}
312+
}
313+
314+
return results
315+
}
316+
}
317+
```
318+
249319
<!-- tabs:end -->
250320

251321
<!-- end -->

lcci/17.17.Multi Search/README_EN.md

+70
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,76 @@ func multiSearch(big string, smalls []string) [][]int {
251251
}
252252
```
253253

254+
```swift
255+
class TrieNode {
256+
var idx: Int
257+
var children: [TrieNode?]
258+
259+
init() {
260+
self.idx = -1
261+
self.children = Array(repeating: nil, count: 26)
262+
}
263+
}
264+
265+
class Trie {
266+
private let root: TrieNode
267+
268+
init() {
269+
self.root = TrieNode()
270+
}
271+
272+
func insert(_ word: String, _ index: Int) {
273+
var node = root
274+
for ch in word {
275+
let i = Int(ch.asciiValue! - Character("a").asciiValue!)
276+
if node.children[i] == nil {
277+
node.children[i] = TrieNode()
278+
}
279+
node = node.children[i]!
280+
}
281+
node.idx = index
282+
}
283+
284+
func search(_ word: String) -> [Int] {
285+
var node = root
286+
var results = [Int]()
287+
for ch in word {
288+
let i = Int(ch.asciiValue! - Character("a").asciiValue!)
289+
if node.children[i] == nil {
290+
break
291+
}
292+
node = node.children[i]!
293+
if node.idx != -1 {
294+
results.append(node.idx)
295+
}
296+
}
297+
return results
298+
}
299+
}
300+
301+
class Solution {
302+
func multiSearch(_ big: String, _ smalls: [String]) -> [[Int]] {
303+
let trie = Trie()
304+
for (index, small) in smalls.enumerated() {
305+
trie.insert(small, index)
306+
}
307+
308+
var results = Array(repeating: [Int](), count: smalls.count)
309+
let bigChars = Array(big)
310+
311+
for i in 0..<bigChars.count {
312+
let substring = String(bigChars[i...])
313+
let indices = trie.search(substring)
314+
for index in indices {
315+
results[index].append(i)
316+
}
317+
}
318+
319+
return results
320+
}
321+
}
322+
```
323+
254324
<!-- tabs:end -->
255325

256326
<!-- end -->
+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
class TrieNode {
2+
var idx: Int
3+
var children: [TrieNode?]
4+
5+
init() {
6+
self.idx = -1
7+
self.children = Array(repeating: nil, count: 26)
8+
}
9+
}
10+
11+
class Trie {
12+
private let root: TrieNode
13+
14+
init() {
15+
self.root = TrieNode()
16+
}
17+
18+
func insert(_ word: String, _ index: Int) {
19+
var node = root
20+
for ch in word {
21+
let i = Int(ch.asciiValue! - Character("a").asciiValue!)
22+
if node.children[i] == nil {
23+
node.children[i] = TrieNode()
24+
}
25+
node = node.children[i]!
26+
}
27+
node.idx = index
28+
}
29+
30+
func search(_ word: String) -> [Int] {
31+
var node = root
32+
var results = [Int]()
33+
for ch in word {
34+
let i = Int(ch.asciiValue! - Character("a").asciiValue!)
35+
if node.children[i] == nil {
36+
break
37+
}
38+
node = node.children[i]!
39+
if node.idx != -1 {
40+
results.append(node.idx)
41+
}
42+
}
43+
return results
44+
}
45+
}
46+
47+
class Solution {
48+
func multiSearch(_ big: String, _ smalls: [String]) -> [[Int]] {
49+
let trie = Trie()
50+
for (index, small) in smalls.enumerated() {
51+
trie.insert(small, index)
52+
}
53+
54+
var results = Array(repeating: [Int](), count: smalls.count)
55+
let bigChars = Array(big)
56+
57+
for i in 0..<bigChars.count {
58+
let substring = String(bigChars[i...])
59+
let indices = trie.search(substring)
60+
for index in indices {
61+
results[index].append(i)
62+
}
63+
}
64+
65+
return results
66+
}
67+
}

0 commit comments

Comments
 (0)