Регулярное решение:
Шаг 1: Разделите каждый символ символом-разделителем, который не является частью строки ввода, включая завершающий (т. Е. ~
):
(.)
$1~
Пример ввода: "abkebabkebabkeb"
Пример вывода: "a~b~k~e~b~a~b~k~e~b~a~b~k~e~b~"
Попробуйте онлайн в Retina. ( ПРИМЕЧАНИЕ: Retina - это язык программирования на основе регулярных выражений, разработанный для быстрого тестирования регулярных выражений и способный успешно конкурировать в вызовы для игры в гольф . )
Шаг 2: Используйте следующее регулярное выражение, чтобы найти самую короткую повторяющуюся подстроку (где ~
- выбранный символ-разделитель):
^(([^~]+~)*?)\1*$
$1
Пояснение:
^(([^~]+~)*?)\1*$
^ $ # Start and end, to match the entire input-string
([^~]+~) # Capture group 1: One or more non-'~' followed by a '~'
( *?) # Capture group 2: Repeated zero or more time optionally
\1* # Followed by the first capture group repeated zero or more times
$1 # Replace the entire input-string with the first capture group match
Пример ввода: "a~b~k~e~b~a~b~k~e~b~a~b~k~e~b~"
Пример вывода: "a~b~k~e~b~"
Попробуйте онлайн в Retina.
Шаг 3: Снова удалите наш символ-разделитель, чтобы получить желаемый результат.
~
<empty>
Пример ввода: "a~b~k~e~b~"
Пример вывода: "abkeb"
Попробуйте онлайн в Retina.
Вот пример реализации на Java.