@@ -6,115 +6,115 @@ print("Hello, Swift4!")
6
6
#endif
7
7
8
8
func ZetaAlgorithm( ptnr: String ) -> [ Int ] ? {
9
+
10
+ let pattern = Array ( ptnr. characters)
11
+ let patternLength : Int = pattern. count
12
+
13
+ guard patternLength > 0 else {
14
+ return nil
15
+ }
16
+
17
+ var zeta : [ Int ] = [ Int] ( repeating: 0 , count: patternLength)
18
+
19
+ var left : Int = 0
20
+ var right : Int = 0
21
+ var k_1 : Int = 0
22
+ var betaLength : Int = 0
23
+ var textIndex : Int = 0
24
+ var patternIndex : Int = 0
25
+
26
+ for k in 1 ..< patternLength {
27
+ if k > right {
28
+ patternIndex = 0
29
+
30
+ while k + patternIndex < patternLength &&
31
+ pattern [ k + patternIndex] == pattern [ patternIndex] {
32
+ patternIndex = patternIndex + 1
33
+ }
34
+
35
+ zeta [ k] = patternIndex
36
+
37
+ if zeta [ k] > 0 {
38
+ left = k
39
+ right = k + zeta[ k] - 1
40
+ }
41
+ } else {
42
+ k_1 = k - left + 1
43
+ betaLength = right - k + 1
44
+
45
+ if zeta [ k_1 - 1 ] < betaLength {
46
+ zeta [ k] = zeta [ k_1 - 1 ]
47
+ } else if zeta [ k_1 - 1 ] >= betaLength {
48
+ textIndex = betaLength
49
+ patternIndex = right + 1
50
+
51
+ while patternIndex < patternLength && pattern [ textIndex] == pattern [ patternIndex] {
52
+ textIndex = textIndex + 1
53
+ patternIndex = patternIndex + 1
54
+ }
55
+ zeta [ k] = patternIndex - k
56
+ left = k
57
+ right = patternIndex - 1
58
+ }
59
+ }
60
+ }
61
+ return zeta
62
+ }
63
+
64
+ extension String {
65
+
66
+ func indexesOf( ptnr: String ) -> [ Int ] ? {
9
67
68
+ let text = Array ( self . characters)
10
69
let pattern = Array ( ptnr. characters)
70
+
71
+ let textLength : Int = text. count
11
72
let patternLength : Int = pattern. count
12
73
13
74
guard patternLength > 0 else {
14
- return nil
75
+ return nil
15
76
}
16
77
17
- var zeta : [ Int ] = [ Int] ( repeating: 0 , count: patternLength)
18
-
19
- var left : Int = 0
20
- var right : Int = 0
21
- var k_1 : Int = 0
22
- var betaLength : Int = 0
78
+ var suffixPrefix : [ Int ] = [ Int] ( repeating: 0 , count: patternLength)
23
79
var textIndex : Int = 0
24
80
var patternIndex : Int = 0
81
+ var indexes : [ Int ] = [ Int] ( )
25
82
26
- for k in 1 ..< patternLength {
27
- if k > right {
28
- patternIndex = 0
29
-
30
- while k + patternIndex < patternLength &&
31
- pattern [ k + patternIndex] == pattern [ patternIndex] {
32
- patternIndex = patternIndex + 1
33
- }
34
-
35
- zeta [ k] = patternIndex
36
-
37
- if zeta [ k] > 0 {
38
- left = k
39
- right = k + zeta[ k] - 1
40
- }
41
- } else {
42
- k_1 = k - left + 1
43
- betaLength = right - k + 1
44
-
45
- if zeta [ k_1 - 1 ] < betaLength {
46
- zeta [ k] = zeta [ k_1 - 1 ]
47
- } else if zeta [ k_1 - 1 ] >= betaLength {
48
- textIndex = betaLength
49
- patternIndex = right + 1
50
-
51
- while patternIndex < patternLength && pattern [ textIndex] == pattern [ patternIndex] {
52
- textIndex = textIndex + 1
53
- patternIndex = patternIndex + 1
54
- }
55
- zeta [ k] = patternIndex - k
56
- left = k
57
- right = patternIndex - 1
58
- }
59
- }
83
+ /* Pre-processing stage: computing the table for the shifts (through Z-Algorithm) */
84
+ let zeta = ZetaAlgorithm ( ptnr: ptnr)
85
+
86
+ for patternIndex in ( 1 ..< patternLength) . reversed ( ) {
87
+ textIndex = patternIndex + zeta![ patternIndex] - 1
88
+ suffixPrefix [ textIndex] = zeta![ patternIndex]
60
89
}
61
- return zeta
62
- }
63
-
64
- extension String {
65
90
66
- func indexesOf( ptnr: String ) -> [ Int ] ? {
67
-
68
- let text = Array ( self . characters)
69
- let pattern = Array ( ptnr. characters)
70
-
71
- let textLength : Int = text. count
72
- let patternLength : Int = pattern. count
73
-
74
- guard patternLength > 0 else {
75
- return nil
76
- }
77
-
78
- var suffixPrefix : [ Int ] = [ Int] ( repeating: 0 , count: patternLength)
79
- var textIndex : Int = 0
80
- var patternIndex : Int = 0
81
- var indexes : [ Int ] = [ Int] ( )
82
-
83
- /* Pre-processing stage: computing the table for the shifts (through Z-Algorithm) */
84
- let zeta = ZetaAlgorithm ( ptnr: ptnr)
85
-
86
- for patternIndex in ( 1 ..< patternLength) . reversed ( ) {
87
- textIndex = patternIndex + zeta![ patternIndex] - 1
88
- suffixPrefix [ textIndex] = zeta![ patternIndex]
89
- }
90
-
91
- /* Search stage: scanning the text for pattern matching */
92
- textIndex = 0
93
- patternIndex = 0
94
-
95
- while textIndex + ( patternLength - patternIndex - 1 ) < textLength {
96
-
97
- while patternIndex < patternLength && text [ textIndex] == pattern [ patternIndex] {
98
- textIndex = textIndex + 1
99
- patternIndex = patternIndex + 1
100
- }
101
-
102
- if patternIndex == patternLength {
103
- indexes. append ( textIndex - patternIndex)
104
- }
105
-
106
- if patternIndex == 0 {
107
- textIndex = textIndex + 1
108
- } else {
109
- patternIndex = suffixPrefix [ patternIndex - 1 ]
110
- }
111
- }
112
-
113
- guard !indexes. isEmpty else {
114
- return nil
115
- }
116
- return indexes
91
+ /* Search stage: scanning the text for pattern matching */
92
+ textIndex = 0
93
+ patternIndex = 0
94
+
95
+ while textIndex + ( patternLength - patternIndex - 1 ) < textLength {
96
+
97
+ while patternIndex < patternLength && text [ textIndex] == pattern [ patternIndex] {
98
+ textIndex = textIndex + 1
99
+ patternIndex = patternIndex + 1
100
+ }
101
+
102
+ if patternIndex == patternLength {
103
+ indexes. append ( textIndex - patternIndex)
104
+ }
105
+
106
+ if patternIndex == 0 {
107
+ textIndex = textIndex + 1
108
+ } else {
109
+ patternIndex = suffixPrefix [ patternIndex - 1 ]
110
+ }
111
+ }
112
+
113
+ guard !indexes. isEmpty else {
114
+ return nil
117
115
}
116
+ return indexes
117
+ }
118
118
}
119
119
120
120
/* Examples */
0 commit comments