Skip to content

Commit be78323

Browse files
committed
Knuth-Morris-Pratt updated to Swift 4
1 parent 0e0ae64 commit be78323

File tree

1 file changed

+29
-24
lines changed

1 file changed

+29
-24
lines changed

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

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,53 @@
11
//: Playground - noun: a place where people can play
22

3-
func ZetaAlgorithm(ptnr: String) -> [Int]? {
3+
// last checked with Xcode 9.0b4
4+
#if swift(>=4.0)
5+
print("Hello, Swift4!")
6+
#endif
47

8+
func ZetaAlgorithm(ptnr: String) -> [Int]? {
9+
510
let pattern = Array(ptnr.characters)
611
let patternLength: Int = pattern.count
7-
12+
813
guard patternLength > 0 else {
914
return nil
1015
}
11-
16+
1217
var zeta: [Int] = [Int](repeating: 0, count: patternLength)
13-
18+
1419
var left: Int = 0
1520
var right: Int = 0
1621
var k_1: Int = 0
1722
var betaLength: Int = 0
1823
var textIndex: Int = 0
1924
var patternIndex: Int = 0
20-
25+
2126
for k in 1 ..< patternLength {
2227
if k > right {
2328
patternIndex = 0
24-
29+
2530
while k + patternIndex < patternLength &&
2631
pattern[k + patternIndex] == pattern[patternIndex] {
27-
patternIndex = patternIndex + 1
32+
patternIndex = patternIndex + 1
2833
}
29-
34+
3035
zeta[k] = patternIndex
31-
36+
3237
if zeta[k] > 0 {
3338
left = k
3439
right = k + zeta[k] - 1
3540
}
3641
} else {
3742
k_1 = k - left + 1
3843
betaLength = right - k + 1
39-
44+
4045
if zeta[k_1 - 1] < betaLength {
4146
zeta[k] = zeta[k_1 - 1]
4247
} else if zeta[k_1 - 1] >= betaLength {
4348
textIndex = betaLength
4449
patternIndex = right + 1
45-
50+
4651
while patternIndex < patternLength && pattern[textIndex] == pattern[patternIndex] {
4752
textIndex = textIndex + 1
4853
patternIndex = patternIndex + 1
@@ -57,54 +62,54 @@ func ZetaAlgorithm(ptnr: String) -> [Int]? {
5762
}
5863

5964
extension String {
60-
65+
6166
func indexesOf(ptnr: String) -> [Int]? {
62-
67+
6368
let text = Array(self.characters)
6469
let pattern = Array(ptnr.characters)
65-
70+
6671
let textLength: Int = text.count
6772
let patternLength: Int = pattern.count
68-
73+
6974
guard patternLength > 0 else {
7075
return nil
7176
}
72-
77+
7378
var suffixPrefix: [Int] = [Int](repeating: 0, count: patternLength)
7479
var textIndex: Int = 0
7580
var patternIndex: Int = 0
7681
var indexes: [Int] = [Int]()
77-
82+
7883
/* Pre-processing stage: computing the table for the shifts (through Z-Algorithm) */
7984
let zeta = ZetaAlgorithm(ptnr: ptnr)
80-
85+
8186
for patternIndex in (1 ..< patternLength).reversed() {
8287
textIndex = patternIndex + zeta![patternIndex] - 1
8388
suffixPrefix[textIndex] = zeta![patternIndex]
8489
}
85-
90+
8691
/* Search stage: scanning the text for pattern matching */
8792
textIndex = 0
8893
patternIndex = 0
89-
94+
9095
while textIndex + (patternLength - patternIndex - 1) < textLength {
91-
96+
9297
while patternIndex < patternLength && text[textIndex] == pattern[patternIndex] {
9398
textIndex = textIndex + 1
9499
patternIndex = patternIndex + 1
95100
}
96-
101+
97102
if patternIndex == patternLength {
98103
indexes.append(textIndex - patternIndex)
99104
}
100-
105+
101106
if patternIndex == 0 {
102107
textIndex = textIndex + 1
103108
} else {
104109
patternIndex = suffixPrefix[patternIndex - 1]
105110
}
106111
}
107-
112+
108113
guard !indexes.isEmpty else {
109114
return nil
110115
}

0 commit comments

Comments
 (0)