Я хочу проверить правильность моего алгоритма.Восстановить пропущенную пробел строку в O (n^2)
Получая строку из п символов со всем белым пространством опущены,
Ex: "itwasthebestoftimes"
Дайте алгоритм динамического программирования, который определяет, если строка может быть разбита на действительную последовательность слов, и восстановить действительную строку пробелы, в O (n).
Моя идея:
Сначала найдите все подстроки строки (O (п)), и для каждой подстроки карты ее положение в пространстве и длины, как интервал.
Ex: "it was the best"
[] [-] [-] [--]
[---] []
[]
(Пространства добавлены, чтобы упростить просмотр).
В приведенном выше примере, «это» является действительным, и получает значение интервала из 2, «был» получает 3 и т.д. Строка «ТВАС» также справедливо, и получает значение 4.
Затем это уменьшено до задачи мини-макс, чтобы найти максимальную длину, не перекрывающуюся в наборе интервалов. Так как допустимая строка должна содержать все буквы, то ответом будет максимальный интервал между перекрывающимися интервалами, и нахождение этого занимает Theta (n * log (n)).
Поэтому решение будет принимать O (п + п * журнала (п)) = O (п)
ли мое мышление правильно?
Как вы выбираете, какой подстроки идет в какой строке? Когда вы пытаетесь поместить новую подстроку в нижнюю строку, потому что она перекрывается, откуда вы знаете - может быть, путем перестановки существующих подстрок в строках вы могли бы подгонять новую подстроку? – avysk
Жаль об этом, отредактирован. Не имеет значения, в какую «строку» входит подстрока, она произвольна для минимаксного решателя. Все, что имеет значение, проверяет, есть ли столкновение или нет, которое задается координатами интервала.Строки только там, чтобы облегчить визуальное представление – mrybak3
На самом деле, есть ли у вас указатель на алгоритмы O (n log n) для нахождения непересекающегося подмножества интервалов максимальной общей длины? Это легко сделать в O (n^2) (с тем же динамическим программированием), но я не вижу сразу (и не могу найти никаких материалов после краткого поиска), как это сделать в O (n log n). Вы уверены, что не смешиваете эту проблему с нахождением максимального * числа * непересекающихся интервалов, а не максимальной * общей длины *? Для максимального числа жадный алгоритм - это O (n log n). – avysk