これが私が思いついたScalaソリューションです。
def repeatMatch(password: String): List[(Int, Int)] = {
val length = password.length
@tailrec
def loop(offset: Int,
result: List[(Int, Int)]): List[(Int, Int)] = {
if (offset >= length) result.reverse
else {
val candidate = password.charAt(offset)
val run = password.substring(offset).zip(Array.fill(length)(candidate)).
takeWhile{case (first, second) => first == second}.length
if (run > 2) loop(offset + run, (offset, run) :: result)
else loop(offset + 1, result)
}
}
loop(0, List.empty[(Int, Int)])
}
テスト ケース の場合repeatMatch("abccccdefffg")
、結果は次のようになります。List((2,4), (8,3))
たぶん、計算run
が改善される可能性があります。