2013-07-16 18 views
7

Podczas przygotowań do egzaminu natrafiłem na następujący problem:Algorytm: Drukowanie poprawnego indeksu dla sekwencji znaków

Wyobraź sobie alfabet słów. Przykład:

a ==> 1 
b ==> 2 
c ==> 3 
... 
z ==> 26 
ab ==> 27 
ac ==> 28 
... 
az ==> 51 
bc ==> 52 
and so on. 

sekwencja znaków musi być w porządku rosnącym wyłącznie (czyli „ab” jest ważny, ale „BA” nie).

Pytanie: Podać dowolne słowo, wydrukować jego indeks, jeśli jest prawidłowy i 0, jeśli nie.

Input Output 
ab 27 
ba 0 
aez 441 

Wszelkie wskazówki dotyczące rozwiązania tego problemu byłyby mile widziane.

+2

Czy spróbować czegoś? Co nie działało? Musisz zadać konkretne pytanie. –

+0

jakie jest pytanie? –

+0

Zapomniałeś o '' aa'' czy jest to celowo? – hivert

Odpowiedz

7

Podam kilka wskazówek:

  • można znaleźć wzór na liczbę takich słów o określonej długości k?
  • Teraz popraw długość k i literę l. Ile słów o długości k zaczyna się od l czy są one?

Podpowiedź: Pascal trójkąt. Jeśli potrzebujesz więcej wskazówek, może pomóc http://en.wikipedia.org/wiki/Combinadic. Jeśli potrzebujesz wdrożenia, można uzyskać inspirację z funkcji zdefiniowanej w rankingu (języka Python) https://github.com/sagemath/sagelib/blob/master/sage/combinat/choose_nk.py

+0

Masz na myśli, policzyć sposoby ** wybrać ** litery 'k' z 26? I tak dalej? :-) – Nemo

+0

Wydaje się to interesujące. Pozwól mi podrapać się w głowę. : D –

+1

Dla k = 1 będzie 26 takich słów. Dla k = 2, byłyby (25 + 24 + ... + 1 + 0) takie słowa. Dla k = 3 będzie ((24 + 23 + ... + 1) + (23 + 22 + ... + 1) + (22 + 21 + ... + 1) + ... + (2 + 1) + (1)) takie słowa. To trochę wydaje się _Dynamic Programming_ dla mnie. : S –

2
  1. upewnij się, że dane wejściowe są tylko literami. Niepowodzenie, jeśli nie.
  2. Ustaw pętlę na podstawie długości ciągu minus 1.
  3. "Odejmij" wartość pierwszej litery w ciągu od następnej. Jeśli wartość jest równa zero lub dodatnia, oznacza to, że ciąg nie jest rosnący, więc zwróć 0.
  4. Powtórz, przesuwając w górę ciąg znaków o jedną literę na raz, sprawdzając kolejną literę.
  5. Jeśli dojdziesz do końca, jest to rosnący ciąg znaków.

Nie wspominałem o algorytmie obliczania wartości wskaźnika, tylko przypadku wyjścia. Ale daje on początek we właściwym kierunku, a obliczanie indeksu odbywa się według tych samych zasad.

Więcej informacji:

Początek liczenia w górę na pierwszej literze. Kiedy naciśniesz "z", zresetuj do następnego poprawnego ciągu i kontynuuj zliczanie -> "aa" się nie policzy. Dodaj do następnego, które tutaj jest "ab". Po naciśnięciu "az", spróbuj "ba" - zawieść, dodawaj kolejne litery, aż otrzymasz poprawny ciąg "bc" i zacznij znowu odliczać. To jak licznik, który liczy się w górę.

Dang wolno, ale powinien działać, ponieważ to, co robisz ręcznie, aby uzyskać odpowiedź.

BTW, jest znacznie bardziej eleganckie rozwiązanie zasugerował przez @hivert który byłby prawie natychmiastowy obliczyć ...

+1

Myślę, że pomijasz trudną część pytania. – Nemo

+0

Próbuję zostawić jak najwięcej mięsa na kości, jak to możliwe dla OP. Nie byłem pewien, na jak długo "szukał pomocy", czego szukał, więc podałem tylko małą podpowiedź na początek. Mogę (spróbować?) Dodać więcej później, jeśli to konieczne. Zawsze można to zrobić jako brutalną siłę, jeśli jest to potrzebne. Po prostu policz i kiedy dotrzesz do końca alfabetu "dostosuj" :) –

+0

@MichaelDorgan: Udało mi się wymyślić coś podobnego do odrzucenia nieprawidłowych sekwencji. Generowanie danych wyjściowych dla prawidłowego ciągu jest tym, co niepokoi mnie. :) –

Powiązane problemy