Skip to content

Commit e3967df

Browse files
swift 3 fix
1 parent c416818 commit e3967df

File tree

7 files changed

+52
-60
lines changed

7 files changed

+52
-60
lines changed

Knuth-Morris-Pratt/KnuthMorrisPratt.playground/Contents.swift

+6-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ func ZetaAlgorithm(ptnr: String) -> [Int]? {
1010
return nil
1111
}
1212

13-
var zeta: [Int] = [Int](count: patternLength, repeatedValue: 0)
13+
var zeta: [Int] = [Int](repeating: 0, count: patternLength)
1414

1515
var left: Int = 0
1616
var right: Int = 0
@@ -71,15 +71,15 @@ extension String {
7171
return nil
7272
}
7373

74-
var suffixPrefix: [Int] = [Int](count: patternLength, repeatedValue: 0)
74+
var suffixPrefix: [Int] = [Int](repeating: 0, count: patternLength)
7575
var textIndex: Int = 0
7676
var patternIndex: Int = 0
7777
var indexes: [Int] = [Int]()
7878

7979
/* Pre-processing stage: computing the table for the shifts (through Z-Algorithm) */
80-
let zeta = ZetaAlgorithm(ptnr)
80+
let zeta = ZetaAlgorithm(ptnr: ptnr)
8181

82-
for patternIndex in (1 ..< patternLength).reverse() {
82+
for patternIndex in (1 ..< patternLength).reversed() {
8383
textIndex = patternIndex + zeta![patternIndex] - 1
8484
suffixPrefix[textIndex] = zeta![patternIndex]
8585
}
@@ -116,7 +116,7 @@ extension String {
116116
/* Examples */
117117

118118
let dna = "ACCCGGTTTTAAAGAACCACCATAAGATATAGACAGATATAGGACAGATATAGAGACAAAACCCCATACCCCAATATTTTTTTGGGGAGAAAAACACCACAGATAGATACACAGACTACACGAGATACGACATACAGCAGCATAACGACAACAGCAGATAGACGATCATAACAGCAATCAGACCGAGCGCAGCAGCTTTTAAGCACCAGCCCCACAAAAAACGACAATFATCATCATATACAGACGACGACACGACATATCACACGACAGCATA"
119-
dna.indexesOf("CATA") // [20, 64, 130, 140, 166, 234, 255, 270]
119+
dna.indexesOf(ptnr: "CATA") // [20, 64, 130, 140, 166, 234, 255, 270]
120120

121121
let concert = "🎼🎹🎹🎸🎸🎻🎻🎷🎺🎤👏👏👏"
122-
concert.indexesOf("🎻🎷") // [6]
122+
concert.indexesOf(ptnr: "🎻🎷") // [6]

Knuth-Morris-Pratt/KnuthMorrisPratt.playground/timeline.xctimeline

-6
This file was deleted.

Knuth-Morris-Pratt/KnuthMorrisPratt.swift

+16-16
Original file line numberDiff line numberDiff line change
@@ -9,54 +9,54 @@
99
import Foundation
1010

1111
extension String {
12-
12+
1313
func indexesOf(ptnr: String) -> [Int]? {
14-
14+
1515
let text = Array(self.characters)
1616
let pattern = Array(ptnr.characters)
17-
17+
1818
let textLength: Int = text.count
1919
let patternLength: Int = pattern.count
20-
20+
2121
guard patternLength > 0 else {
2222
return nil
2323
}
24-
25-
var suffixPrefix: [Int] = [Int](count: patternLength, repeatedValue: 0)
24+
25+
var suffixPrefix: [Int] = [Int](repeating: 0, count: patternLength)
2626
var textIndex: Int = 0
2727
var patternIndex: Int = 0
2828
var indexes: [Int] = [Int]()
29-
29+
3030
/* Pre-processing stage: computing the table for the shifts (through Z-Algorithm) */
31-
let zeta = ZetaAlgorithm(ptnr)
32-
33-
for patternIndex in (1 ..< patternLength).reverse() {
31+
let zeta = ZetaAlgorithm(ptnr: ptnr)
32+
33+
for patternIndex in (1 ..< patternLength).reversed() {
3434
textIndex = patternIndex + zeta![patternIndex] - 1
3535
suffixPrefix[textIndex] = zeta![patternIndex]
3636
}
37-
37+
3838
/* Search stage: scanning the text for pattern matching */
3939
textIndex = 0
4040
patternIndex = 0
41-
41+
4242
while textIndex + (patternLength - patternIndex - 1) < textLength {
43-
43+
4444
while patternIndex < patternLength && text[textIndex] == pattern[patternIndex] {
4545
textIndex = textIndex + 1
4646
patternIndex = patternIndex + 1
4747
}
48-
48+
4949
if patternIndex == patternLength {
5050
indexes.append(textIndex - patternIndex)
5151
}
52-
52+
5353
if patternIndex == 0 {
5454
textIndex = textIndex + 1
5555
} else {
5656
patternIndex = suffixPrefix[patternIndex - 1]
5757
}
5858
}
59-
59+
6060
guard !indexes.isEmpty else {
6161
return nil
6262
}

Z-Algorithm/ZAlgorithm.swift

+13-13
Original file line numberDiff line numberDiff line change
@@ -9,53 +9,53 @@
99
import Foundation
1010

1111
func ZetaAlgorithm(ptrn: String) -> [Int]? {
12-
12+
1313
let pattern = Array(ptrn.characters)
1414
let patternLength: Int = pattern.count
15-
15+
1616
guard patternLength > 0 else {
1717
return nil
1818
}
19-
20-
var zeta: [Int] = [Int](count: patternLength, repeatedValue: 0)
21-
19+
20+
var zeta: [Int] = [Int](repeating: 0, count: patternLength)
21+
2222
var left: Int = 0
2323
var right: Int = 0
2424
var k_1: Int = 0
2525
var betaLength: Int = 0
2626
var textIndex: Int = 0
2727
var patternIndex: Int = 0
28-
28+
2929
for k in 1 ..< patternLength {
3030
if k > right {
3131
patternIndex = 0
32-
32+
3333
while k + patternIndex < patternLength &&
3434
pattern[k + patternIndex] == pattern[patternIndex] {
35-
patternIndex = patternIndex + 1
35+
patternIndex = patternIndex + 1
3636
}
37-
37+
3838
zeta[k] = patternIndex
39-
39+
4040
if zeta[k] > 0 {
4141
left = k
4242
right = k + zeta[k] - 1
4343
}
4444
} else {
4545
k_1 = k - left + 1
4646
betaLength = right - k + 1
47-
47+
4848
if zeta[k_1 - 1] < betaLength {
4949
zeta[k] = zeta[k_1 - 1]
5050
} else if zeta[k_1 - 1] >= betaLength {
5151
textIndex = betaLength
5252
patternIndex = right + 1
53-
53+
5454
while patternIndex < patternLength && pattern[textIndex] == pattern[patternIndex] {
5555
textIndex = textIndex + 1
5656
patternIndex = patternIndex + 1
5757
}
58-
58+
5959
zeta[k] = patternIndex - k
6060
left = k
6161
right = patternIndex - 1

Z-Algorithm/ZetaAlgorithm.playground/Contents.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ func ZetaAlgorithm(ptrn: String) -> [Int]? {
1010
return nil
1111
}
1212

13-
var zeta: [Int] = [Int](count: patternLength, repeatedValue: 0)
13+
var zeta: [Int] = [Int](repeating: 0, count: patternLength)
1414

1515
var left: Int = 0
1616
var right: Int = 0
@@ -63,7 +63,7 @@ extension String {
6363

6464
func indexesOf(pattern: String) -> [Int]? {
6565
let patternLength: Int = pattern.characters.count
66-
let zeta = ZetaAlgorithm(pattern + "💲" + self)
66+
let zeta = ZetaAlgorithm(ptrn: pattern + "💲" + self)
6767

6868
guard zeta != nil else {
6969
return nil
@@ -89,7 +89,7 @@ extension String {
8989
/* Examples */
9090

9191
let str = "Hello, playground!"
92-
str.indexesOf("ground") // [11]
92+
str.indexesOf(pattern: "ground") // [11]
9393

9494
let traffic = "🚗🚙🚌🚕🚑🚐🚗🚒🚚🚎🚛🚐🏎🚜🚗🏍🚒🚲🚕🚓🚌🚑"
95-
traffic.indexesOf("🚑") // [4, 21]
95+
traffic.indexesOf(pattern: "🚑") // [4, 21]

Z-Algorithm/ZetaAlgorithm.playground/timeline.xctimeline

-6
This file was deleted.

Z-Algorithm/ZetaAlgorithm.swift

+13-9
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,28 @@
99
import Foundation
1010

1111
extension String {
12-
12+
1313
func indexesOf(pattern: String) -> [Int]? {
1414
let patternLength: Int = pattern.characters.count
15-
let zeta = ZetaAlgorithm(pattern + "💲" + self)
16-
15+
let zeta = ZetaAlgorithm(ptrn: pattern + "💲" + self)
16+
17+
guard zeta != nil else {
18+
return nil
19+
}
20+
1721
var indexes: [Int] = [Int]()
18-
22+
1923
/* Scan the zeta array to find matched patterns */
20-
for index in indexes {
21-
if index == patternLength {
22-
indexes.append(index)
24+
for i in 0 ..< zeta!.count {
25+
if zeta![i] == patternLength {
26+
indexes.append(i - patternLength - 1)
2327
}
2428
}
25-
29+
2630
guard !indexes.isEmpty else {
2731
return nil
2832
}
29-
33+
3034
return indexes
3135
}
3236
}

0 commit comments

Comments
 (0)