35 lines
952 B
Kotlin
35 lines
952 B
Kotlin
class Solution {
|
|
private fun buildTable(words: Sequence<String>): Map<String, Int> {
|
|
val table = mutableMapOf<String, Int>()
|
|
|
|
words.forEach {
|
|
table.put(it, 1 + table.getOrElse(it) { 0 })
|
|
}
|
|
|
|
return table
|
|
}
|
|
|
|
private fun buildTable(
|
|
s: String,
|
|
length: Int,
|
|
): Map<String, Int> = buildTable(s.chunked(length).asSequence())
|
|
|
|
fun findSubstring(
|
|
s: String,
|
|
words: Array<String>,
|
|
): List<Int> {
|
|
val expectedFrequencies = buildTable(words.asSequence())
|
|
val wordLen = words.first().length
|
|
val windowSize = wordLen * words.size
|
|
|
|
return s
|
|
.windowed(windowSize)
|
|
.zip(s.indices)
|
|
.filter { (window, _) ->
|
|
val frequencies = buildTable(window, wordLen)
|
|
frequencies == expectedFrequencies
|
|
}
|
|
.map { (_, idx) -> idx }
|
|
.toList()
|
|
}
|
|
}
|