Прошу помочь. Мне хотелось бы как-то аккуратно оформить доказательство следущего утверждения. Думаю, что оно верное.
Пусть
-- конечная строка символов произвольного алфавита, в которой каждый символ содержится ровно два раза. Допускается выполнение следующих операций:
-- удаление двух одинаковых символов идущих друг за другом, то есть символов вида
;
-- замена двух символов, встречающихся в строке в виде
, на один.
Утверждается, что:
существует квадратичный алгоритм проверки сокращения строки с помощью операций до одной из строк -- пустая строка, , .
Пусть на входе содержится строка
длины
. В дальнейшем вся нумерация списков и массивов будет начинаться с единицы.
1) Представим
в виде соответствующего связного списка, который назовем
. Для этого потребуется один проход по
, то есть
шагов. В этом же проходе создадим массив всех элементов строки, который обозначим через
. Общая сложность
.
2) Будем выполнять проход по
, начиная со второго элемента. На каждом шаге будем проверять равенство текущего и предыдущего элементов. Если равенство выполняется, то будем записывать индексы этих элементов в новый массив
. Общая сложность
.
3) Будем выполнять проход по
. На каждом шаге будем удалять элемент
соответсвующего индекса. Удаление элемента связного списка имеет сложность
. Поэтому общая сложность прохода
.
4) Будем выполнять проход по
, начиная с элемента под номером
. Запомним элементы
и
. На следущих шагах сравним текущий и предыдущие элементы с элементами памяти согласно условию (a): текущий элемент равен первому элементу памяти и предыдущий элемент равен второму элементу памяти. Если условие выполняется, то удалим второй элемент
и предыдущий элемент текущего шага. Повторим проход. Сложность каждого прохода
.
5) Если условие (a) не выполняется, то выполним итерацию прохода (4), начиная с
. Повторим (4) и (5) пункты
раз. Каждый повторение сложностью
. Общая сложность
.