Wprowadzenie
W tym wyzwaniu Twoim zadaniem jest znalezienie uogólnionych podciągów ciągów. Podsekwencje niekoniecznie są ciągłe i mogą również „owijać” sznurek, przechodząc poza jego koniec i rozpoczynając od początku. Będziesz jednak chciał zminimalizować liczbę owinięć.
Bardziej formalnie, niech ui vbyć dowolne dwa ciągi i k ≥ 0liczbą całkowitą. Mówimy, że ujest kpakowania, dozowania podciąg z v, jeśli istnieją wyraźne wskaźniki , takie, że , i co najwyżej indeksów zaspokoić . Oznacza to, że można go znaleźć w środku , przechodząc od lewej do prawej, wybierając po drodze niektóre z jego postaci i owijając się w większości przypadków (równoważnie, wykonując co najwyżej przemiatanie ). Zauważ, że żadna postać nie może być wybrana więcej niż jeden raz, nawet po zawinięciu, a podsekwencje owijania są dokładnie zwykłymi podsekwencjami, które wszyscy znamy.i1, i2, ..., ilen(u)u == v[i1] v[i2] ... v[ilen(u)]kijij > ij+1uvkk+1v0
Zadanie
Twoje wejścia są dwa niepuste ciągi alfanumeryczne ui v, a wyjście jest najmniejsza liczba całkowita ktakie, że ujest kpakowania, dozowania podciąg v. Jeżeli takiego nie kma, wynik powinien wynosić -1.
Przykład
Rozważ dane wejściowe u := xyzyxzzxyxi v := yxzzazzyxxxyz. Jeśli zaczniemy szukać bohaterów uw vzachłanny sposób, obejrzymy się 3 razy:
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
Zatem poprawne wyjście wynosi co najwyżej 3. Zwróć uwagę, jak lewy znak xjest wybierany jeden raz, a następnie ignorowany przy drugim przeciągnięciu, ponieważ nie można go ponownie użyć. Istnieje jednak krótsza metoda z tylko 2 obejściami:
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
Okazuje się, że jedno zawinięcie (czyli dwa wyciągnięcia po ścieżce) nie wystarczy, więc poprawne wyjście to 2.
Zasady i bonusy
Możesz napisać funkcję lub pełny program, a także, w razie potrzeby, zmienić kolejność wejść. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Istnieje premia w wysokości -10% za obliczenie wszystkich przypadków testowych w sumie poniżej 10 sekund. Będę testować niejasne przypadki na moim komputerze; moja referencyjna implementacja w Pythonie zajmuje około 0,6 sekundy. Mam 7-letniego laptopa z dwurdzeniowym procesorem 1,86 GHz, który warto wziąć pod uwagę.
Przypadki testowe
"me" "moe" -> 0
"meet" "metro" -> -1
"ababa" "abaab" -> 1
"abaab" "baabaa" -> 1
"1c1C1C2B" "1111CCCcB2" -> 3
"reverse" "reserved" -> 2
"abcdefg" "gfedcba" -> 6
"xyzyxzzxyx" "yxzzazzyxxxyz" -> 2
"aasdffdaasdf" "asdfddasdfsdaafsds" -> 2
xjest używany w trzech różnych zakresach. Można go użyć tylko raz.