Okay! Oto moja druga próba.
Chodzi o to, że chcemy sprawdzić, ile znaków na końcu ciągu może zostać ponownie wykorzystanych podczas dołączania dodatkowych znaków w celu uzupełnienia palindromu. W tym celu użyjemy modyfikacji algorytmu dopasowywania ciągów KMP. Używając KMP, szukamy oryginalnego łańcucha dla jego odwrotności. Gdy dojdziemy do samego końca ciągu, będziemy mieli jak najwięcej dopasowania między odwrotnością łańcucha a oryginalnym łańcuchem występującym na końcu łańcucha. Na przykład:
HELLO
O
1010
010
3202
202
1001
1001
W tym miejscu KMP zwykle mówi "brak zgodności", chyba że oryginalny ciąg był palindromem. Ponieważ jednak wiemy, jaka część wstecznego ciągu została dopasowana, możemy zamiast tego po prostu dowiedzieć się, ile jeszcze znaków brakuje, a następnie dodać je na końcu łańcucha. W pierwszym przypadku brakuje nam LLEH
. W drugim przypadku brakuje nam 1
. W trzecim brakuje nam 3
. W ostatnim przypadku niczego nam nie brakuje, ponieważ początkowy łańcuch to palindrom.
Środowisko wykonawcze tego algorytmu jest środowiskiem wykonawczym standardowego wyszukiwania KMP oraz czasem wymaganym do odwrócenia ciągu znaków: O (n) + O (n) = O (n).
Więc teraz argumentować poprawności. Będzie to wymagało pewnego wysiłku. Rozważmy optymalną odpowiedź:
| original string | | extra characters |
Załóżmy, że czytasz ten tył od końca, co oznacza, że będziemy czytać przynajmniej rewersie oryginalnego łańcucha. Część tego odwróconego sznurka rozciąga się wstecz w ciele pierwotnego łańcucha. W rzeczywistości, aby zminimalizować liczbę dodawanych znaków, musi to być jak największa liczba znaków, która kończy się powrotem do samego ciągu. Możemy to zobaczyć tutaj:
| original string | | extra characters |
| overlap |
Co się dzieje w naszym kroku KMP? Cóż, kiedy szukasz odwrotności łańcucha wewnątrz samego siebie, KMP będzie utrzymywał tak długo jak tylko będzie to możliwe przez cały czas, ponieważ działa przez cały łańcuch. Oznacza to, że kiedy KMP trafi na koniec ciągu, dopasowana część, którą zachowa, będzie najdłuższym możliwym meczem, ponieważ KMP przenosi tylko punkt początkowy kandydującego meczu do przodu w przypadku niepowodzenia. W związku z tym mamy najdłuższe możliwe nakładanie się, więc otrzymamy możliwie najkrótszą liczbę znaków na końcu.
Nie jestem w 100% pewna, że to działa, ale wygląda na to, że działa to w każdym przypadku, w którym mogę na nie rzucić. Dowód poprawności wydaje się rozsądny, ale jest trochę niezręczny, ponieważ formalny dowód oparty na KMP prawdopodobnie byłby nieco trudny.
Mam nadzieję, że to pomoże!
Najprostszym sposobem jest po prostu 'str + str.reverse()'. ale wątpię, że to jest min. –
A konflikt instrukcji: gdziekolwiek w słowie! = dopisz tylko –
@RobotWoods .. powiedzmy, że możemy je tylko dołączyć .. jakieś pomysły teraz? –