/*
Find all starting indices of a word inside a larger text.
This function uses String.indexOf in a loop. The JVM implements
substring search in optimized native code, making this approach efficient.
*/
fun findAllOccurrences(text: String, word: String): List<Int> {
// Searching for an empty word is meaningless
if (word.isEmpty()) return emptyList()
val indices = mutableListOf<Int>()
var index = text.indexOf(word) // First occurrence
/*
Loop:
- If indexOf finds a match, record the index.
- Then search again starting one character after the previous match.
This allows detection of overlapping matches.
*/
while (index != -1) {
indices.add(index)
index = text.indexOf(word, index + 1)
}
return indices
}
fun main() {
val text =
"the quick brown fox jumps over the lazy dog. the fox is clever."
val word = "the"
println("Text: $text")
println("Word: \"$word\"\n")
println("Occurrences at indices:")
for (idx in findAllOccurrences(text, word)) {
println(idx)
}
}
/*
run:
Text: the quick brown fox jumps over the lazy dog. the fox is clever.
Word: "the"
Occurrences at indices:
0
31
45
*/