fun splitAndKeep(text: String, delims: Set<Char>): List<String> {
if (text.isEmpty()) return emptyList()
val result = mutableListOf<String>()
var start = 0
for (i in 1 until text.length) {
val prev = text[i - 1]
val curr = text[i]
val prevIsDelim = prev in delims
val currIsDelim = curr in delims
val shouldSplit =
(prevIsDelim != currIsDelim) || // text ↔ delim
(prevIsDelim && currIsDelim && prev != curr) // delim type changed
if (shouldSplit) {
result += text.substring(start, i)
start = i
}
}
// Add final segment
result += text.substring(start)
return result
}
fun main() {
val s = "aa==bbb---cccc++++ddddd"
val delimiters = setOf('=', '-', '+')
val parts = splitAndKeep(s, delimiters)
println(parts)
}
/*
run:
[aa, ==, bbb, ---, cccc, ++++, ddddd]
*/