Как выбрать следующий центр в самом длинном алгоритме палиндрома?


person Michael    schedule 09.12.2010    source источник
comment
Да, большое спасибо за ответ :)   -  person Michael    schedule 10.12.2010


Ответы (1)


Так что движемся вправо ...

Допустим, ваш «текущий» палиндром состоит из 40 букв. (Может быть, в центре, скажем, позиции 100). Вы пытаетесь найти более крупную позицию.

(Хорошо, может быть более крупный, длиной 900 букв, и это 50 000 букв справа - совершенно не связанный с этим. Ничего страшного. Но мы вернемся к этому в будущем. На данный момент у нас есть перемещать центр вправо при поиске палиндромов длиной более 40. Имеет смысл?)

Итак, мы должны двигаться вправо - мы могли бы двигаться на один шаг. НО мы хотим продвинуться как можно дальше, не пропуская ни одного.

Теперь, если следующая справа будет включать эту ... на самом деле, она должна включать самую правую букву из этой группы из 40. (Он не может быть левее, как мы уже проверили, поэтому он должен располагаться в центре после 100, и, поскольку он будет длиннее 40 , он должен включать нашу правую букву, # 120.)

Итак, как далеко нам нужно идти?

Что ж, вы не можете вернуться (со 120) дальше палиндрома! Если это не палиндром посередине, он никогда не будет палиндромом.

3333333333333331110111

Вы можете только «вернуться» к 0. 1, стоящая слева от 0 (например), никогда не может быть палиндромом.

Так что все просто. Вы должны включить нашу крайнюю правую букву (если мы вообще собираемся включать кого-либо из нас), и, если вы хотите, чтобы она была как можно больше, и это должен быть палиндром, потому что палиндромы могут начинаться (я имею в виду «с середины») только с палиндромов.

в приведенном выше примере невозможно, чтобы 1 слева или 0, или, скажем, крайняя правая 3, могли когда-либо в этой вселенной центрировать палиндром, независимо от того, что мы позже обнаружим справа. Вокруг них нет палиндромов, поэтому они «никогда не могут быть» центром палиндрома!

Обратите внимание, что тройка в середине тройки могла бы быть центром более крупного палиндрома .... но не забывайте, что мы уже проверили, что это самый длинный палиндром, поэтому далеко (по центрам слева), так что это не может быть правдой.

Таким образом, любой палиндром, который длиннее этого - скорее, следующая возможная отправная точка для палиндрома длиннее этого - это 0.

Другими словами, это просто центр самого большого палиндрома, который у нас сейчас есть справа. (так что не «111», который является палиндромом, но короткий, а «1110111», который является самым длинным палиндромом, который вы видите застрявшим справа.)

В самом деле, мы должны проверить две возможности: (A) «0» и (B) «1» на втором-последнем месте. конечно, среди этих двух возможностей мы должны идти слева направо, так что (A) «0» действительно следующий, который нужно проверить.

Не забывайте, что эти два (0 и 1, о которых идет речь) эквивалентны высказыванию «есть палиндром 1110111, прилипший к концу, и есть более короткий палиндром 111, прилипший к концу».

Конечно, 1110111 длиннее, поэтому центр 1110111, очевидно, находится слева от центра 111.

Самый длинный палиндром, прикрепленный справа, конечно, будет иметь центр ближе всего к левому краю.

Надеюсь, это проясняет ТОЛЬКО конкретную часть обсуждения в связанном блоге, о котором вы спрашивали !!! Я намеренно повторял себя разными способами, надеюсь, это поможет. Настал день юнгианских алгоритмов :)

Опять же, обратите внимание, что я конкретно и только пытаюсь прояснить очень конкретную проблему, о которой задал Майкл.

Чертовски запутанно, а?

Кстати, я просто проигнорировал вопрос о персонажах вне персонажей - но это не имеет отношения к пониманию того, о чем вы спрашивали.

person Fattie    schedule 09.12.2010
comment
Спасибо за прекрасное объяснение. Думаю, теперь я понял :) - person Michael; 10.12.2010
comment
Итак, вы говорите, что: - 1. Мы знаем центральную точку текущего палиндрома 2. Мы знаем, где находится последний субпалиндром (текущего палиндрома) 3. Учитывая симметрию палиндрома, мы знаем, где находится следующий потенциальный центр Короче говоря, найдите последний субпалиндром и переместите это количество символов вправо или, если нет одного, перейдите к следующему символу - person David Hayes; 19.06.2012