Improve performance of occurrence counting

Changed the algorithm for occurrence counting to improve performance. Previously it was based on expensive string manipulations and checks. The new approach is based on a frequency map with fewer iterations.
This commit is contained in:
Jan Koll 2025-06-27 17:31:38 +02:00
parent 90c6147fc9
commit 911bfac162

View file

@ -23,13 +23,17 @@ fun isSubsequent(text: String, search: String): Boolean {
* as often as it occurs in `search`. * as often as it occurs in `search`.
*/ */
fun countOccurrences(text: String, search: String): Int { fun countOccurrences(text: String, search: String): Int {
val foundCharacters = mutableListOf<Char>() val frequencies = mutableMapOf<Char, Int>()
var mutText = text for (char in text) {
frequencies[char] = frequencies.getOrElse(char) { 0 } + 1
}
var result = 0
for (char in search) { for (char in search) {
if (mutText.contains(char)) { val charFrequency = frequencies[char] ?: 0
foundCharacters.add(char) if (charFrequency > 0) {
mutText = mutText.replaceFirst(char.toString(), "") result++
frequencies[char] = charFrequency - 1
} }
} }
return foundCharacters.size return result
} }