Связанное решение ruby с фрагментами чрезвычайно бедно. Он выполняет несколько абсолютно ненужных операций, таких как разделение, соединение et c, что может резко снизить производительность на длинных входах.
Самый простой способ - использовать регулярное выражение с обратной ссылкой .
str = "aabbbssssssggssrrrr"
Regex.scan(~r/(.)\1{1,}/, str, capture: :first)
#⇒ [["aa"], ["bbb"], ["ssssss"], ["gg"], ["ss"], ["rrrr"]]
Теперь это вопрос предпочтений, как добраться до самой длинной строки, например:
~r/(.)\1{1,}/
|> Regex.scan(str, capture: :first)
|> Enum.sort_by(&-String.length(hd(&1)))
|> hd()
|> hd()
#⇒ "ssssss"
или List.flatten/1
~r/(.)\1{1,}/
|> Regex.scan(str, capture: :first)
|> List.flatten()
|> Enum.sort_by(&-String.length(&1))
|> hd()
#⇒ "ssssss"