import Foundation
/*
Find all starting indices of a word inside a larger text.
This function uses String.range(of:) in a loop. Swift's string
searching is Unicode‑aware and efficient, making this approach
both expressive and reliable.
*/
func findAllOccurrences(in text: String, word: String) -> [Int] {
// Searching for an empty word is meaningless
guard !word.isEmpty else { return [] }
var indices: [Int] = []
var searchStart = text.startIndex
/*
Loop:
- Search for the next occurrence starting at `searchStart`.
- Convert the found range's lowerBound into an integer offset.
- Move forward by one character to allow overlapping matches.
*/
while let range = text.range(of: word, range: searchStart..<text.endIndex) {
let index = text.distance(from: text.startIndex, to: range.lowerBound)
indices.append(index)
// Move forward by one character
searchStart = text.index(range.lowerBound, offsetBy: 1)
}
return indices
}
let text =
"the quick brown fox jumps over the lazy dog. the fox is clever."
let word = "the"
print("Text: \(text)")
print("Word: \"\(word)\"\n")
print("Occurrences at indices:")
for idx in findAllOccurrences(in: text, word: word) {
print(idx)
}
/*
run:
Text: the quick brown fox jumps over the lazy dog. the fox is clever.
Word: "the"
Occurrences at indices:
0
31
45
*/