У меня есть строка S, которая состоит из a и b. Выполните следующую операцию один раз. Цель состоит в том, чтобы получить лексикографически наименьшую строку.
Операция: Обратить ровно одну подстроку S
например.
- if
S = abab, затемOutput = aabb(reversebaстрокиS) - if
S = abbathenOutput = aabb(reversebbaстрокиS)
Мой подход
Случай 1: Если все символы входной строки одинаковы, то вывод будет самой строкой.
Случай 2:, если S имеет вид aaaaaaa....bbbbbb...., тогда ответ будет S сам.
иначе: Найти первое вхождение b в S сказать, что позиция i. Строка S будет выглядеть как
aa...bbb...aaaa...bbbb....aaaa....bbbb....aaaaa...
|
i
Чтобы получить лексикографически наименьшую строку, подстрока, которая будет обращена вспять, начинается с индекса i. См. Ниже возможное окончание j.
aa...bbb...aaaa...bbbb....aaaa....bbbb....aaaaa...
| | | |
i j j j
Обратная подстрока S[i:j] для каждого j и найдите наименьшую строку.
Сложность алгоритма будет O(|S|*|S|) где |S| - длина строки.
Есть ли лучший способ решить эту проблему? Вероятно, решение O(|S|).
То, что я думаю, если мы можем выбрать правильный j в линейном времени, тогда мы закончим. Выберем, что j, где число a является максимальным. Если есть один максимум, мы решили проблему, но что, если это не так? Я много пробовал. Пожалуйста, помогите.