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
5964extension 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