У меня есть строка S
, которая состоит из a
и b
. Выполните следующую операцию один раз. Цель состоит в том, чтобы получить лексикографически наименьшую строку.
Операция: Обратить ровно одну подстроку S
например.
- if
S = abab
, затемOutput = aabb
(reverseba
строкиS
) - if
S = abba
thenOutput = 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
является максимальным. Если есть один максимум, мы решили проблему, но что, если это не так? Я много пробовал. Пожалуйста, помогите.