Skip to content

Commit f09b42b

Browse files
author
Kevin Taniguchi
committed
updated readme
1 parent a2892be commit f09b42b

File tree

3 files changed

+28
-24
lines changed

3 files changed

+28
-24
lines changed

Boyer-Moore/BoyerMoore.playground/Contents.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,10 @@ extension String {
3939
}
4040
}
4141

42-
4342
// A few simple tests
4443

4544
let s = "Hello, World"
4645
s.indexOf(pattern: "World") // 7
4746

4847
let animals = "🐶🐔🐷🐮🐱"
4948
animals.indexOf(pattern: "🐮") // 6
50-
51-
52-

Boyer-Moore/BoyerMoore.playground/timeline.xctimeline

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
version = "3.0">
44
<TimelineItems>
55
<LoggerValueHistoryTimelineItem
6-
documentLocation = "#CharacterRangeLen=1&amp;CharacterRangeLoc=345&amp;EndingColumnNumber=37&amp;EndingLineNumber=9&amp;StartingColumnNumber=9&amp;StartingLineNumber=9&amp;Timestamp=497583231.982889"
6+
documentLocation = "#CharacterRangeLen=1&amp;CharacterRangeLoc=345&amp;EndingColumnNumber=37&amp;EndingLineNumber=9&amp;StartingColumnNumber=9&amp;StartingLineNumber=9&amp;Timestamp=497585369.829471"
77
selectedRepresentationIndex = "0"
88
shouldTrackSuperviewWidth = "NO">
99
</LoggerValueHistoryTimelineItem>
1010
<LoggerValueHistoryTimelineItem
11-
documentLocation = "#CharacterRangeLen=0&amp;CharacterRangeLoc=345&amp;EndingColumnNumber=26&amp;EndingLineNumber=9&amp;StartingColumnNumber=9&amp;StartingLineNumber=9&amp;Timestamp=497583231.983042"
11+
documentLocation = "#CharacterRangeLen=0&amp;CharacterRangeLoc=345&amp;EndingColumnNumber=26&amp;EndingLineNumber=9&amp;StartingColumnNumber=9&amp;StartingLineNumber=9&amp;Timestamp=497585369.82964"
1212
selectedRepresentationIndex = "0"
1313
shouldTrackSuperviewWidth = "NO">
1414
</LoggerValueHistoryTimelineItem>
1515
<LoggerValueHistoryTimelineItem
16-
documentLocation = "#CharacterRangeLen=1&amp;CharacterRangeLoc=345&amp;EndingColumnNumber=25&amp;EndingLineNumber=9&amp;StartingColumnNumber=9&amp;StartingLineNumber=9&amp;Timestamp=497583231.983159"
16+
documentLocation = "#CharacterRangeLen=1&amp;CharacterRangeLoc=345&amp;EndingColumnNumber=25&amp;EndingLineNumber=9&amp;StartingColumnNumber=9&amp;StartingLineNumber=9&amp;Timestamp=497585369.82978"
1717
selectedRepresentationIndex = "0"
1818
shouldTrackSuperviewWidth = "NO">
1919
</LoggerValueHistoryTimelineItem>

Boyer-Moore/README.markdown

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -150,34 +150,42 @@ Here's an implementation of the Boyer-Moore-Horspool algorithm:
150150

151151
```swift
152152
extension String {
153-
public func indexOf(pattern: String) -> String.Index? {
153+
func indexOf(pattern: String) -> String.Index? {
154154
let patternLength = pattern.characters.count
155155
assert(patternLength > 0)
156156
assert(patternLength <= self.characters.count)
157157

158158
var skipTable = [Character: Int]()
159-
for (i, c) in pattern.characters.dropLast().enumerate() {
160-
skipTable[c] = patternLength - i - 1
159+
for (i, c) in pattern.characters.enumerated() {
160+
skipTable[c] = patternLength - i - 1
161161
}
162162

163-
var index = self.startIndex.advancedBy(patternLength - 1)
164-
165-
while index < self.endIndex {
166-
var i = index
167-
var p = pattern.endIndex.predecessor()
168-
169-
while self[i] == pattern[p] {
170-
if p == pattern.startIndex { return i }
171-
i = i.predecessor()
172-
p = p.predecessor()
173-
}
163+
let p = pattern.index(before: pattern.endIndex)
164+
let lastChar = pattern[p]
165+
var i = self.index(startIndex, offsetBy: patternLength - 1)
174166

175-
let advance = skipTable[self[index]] ?? patternLength
176-
index = index.advancedBy(advance)
167+
func backwards() -> String.Index? {
168+
var q = p
169+
var j = i
170+
while q > pattern.startIndex {
171+
j = index(before: j)
172+
q = index(before: q)
173+
if self[j] != pattern[q] { return nil }
174+
}
175+
return j
177176
}
178177

178+
while i < self.endIndex {
179+
let c = self[i]
180+
if c == lastChar {
181+
if let k = backwards() { return k }
182+
i = index(after: i)
183+
} else {
184+
i = index(i, offsetBy: skipTable[c] ?? patternLength)
185+
}
186+
}
179187
return nil
180-
}
188+
}
181189
}
182190
```
183191

0 commit comments

Comments
 (0)