Ein nicht deterministischer endlicher Automat ist eine endliche Zustandsmaschine, bei der ein Tupel auf mehrere Zustände abgebildet wird. Dh Wir ersetzen die übliche Übergangsfunktion eines DFA durch eine andere Funktion .
Wenn Sie wissen, was eine NFA ist, können Sie den nächsten Abschnitt überspringen.
Formale Definition
Eine NFA wird von eindeutig beschrieben
- eine endliche Menge von Zuständen
- eine endliche Menge von Symbolen
- die Übergangsfunktion
- der Ausgangszustand
- eine Menge von Endzuständen
Die Maschine beginnt in und liest eine endliche Kette von Symbolen w ∈ & Sigma; * , für jedes Symbol wird es gleichzeitig die Übergangsfunktion Funktion mit einem aktuellen Zustand anzuwenden und jeden neuen Satz von Zuständen auf den Satz von aktuellen Zuständen hinzuzufügen.
Herausforderung
Für diese Aufgabe werden wir ignorieren , um sie zu vereinfachen. Außerdem besteht das Alphabet immer aus den (Klein-) Buchstaben a bis z und die Menge der Zustände für eine nicht negative ganze Zahl N ist { 0 … N } . Der Ausgangszustand ist immer 0 .
Mit einem gegebenen Wort und einer Beschreibung der NFA besteht Ihre Aufgabe darin, alle Endzustände zu bestimmen.
Beispiel
Betrachten Sie die Zeichenfolge und die folgende Beschreibung:
state, symbol, new-states
0, 'a', [1]
1, 'a', [0]
1, 'b', [1,2]
Die Maschine startet in :
- lese ein : neue Staaten { 1 }
- lese a : neue Staaten { 1 , 2 }
- lese ein : new states { 0 }
- lese ein : neue Staaten { 1 }
- lese a : neue Staaten { 1 , 2 }
Die Endzustände und damit die Ausgabe wären also .
Hinweis: In Schritt (2) wird der Übergang von Zustand auf ∅ abgebildet, da die Beschreibung nur Übergänge zu nicht leeren Mengen enthält.
Regeln
Die Eingabe besteht aus einem String und einer Beschreibung der NFA (ohne -Übergänge):
- Die Eingabezeichenfolge ist immer ein Element von
- gültige Eingaben (nicht beschränkt auf):
- Liste / Array von Tupeln / Listen
- durch neue Zeile getrennte Eingabe
- Die Beschreibung des NFA enthält nur Übergänge mit nicht leeren Mengen als Ergebnis
- Sie können Regeln mit den gleichen Zeichen abkürzen , wenn deren Ergebnis das gleiche ist (z. B. Regeln
0,'a',[1,2]
und0,'b',[1,2]
könnte mit abgekürzt0,"ab",[1,2]
- Sie können jede Regel separat nehmen (zB Regel
0,'a',[1,2]
kann0,'a',[1]
und sein0,'a',[2]
)
- Sie können Regeln mit den gleichen Zeichen abkürzen , wenn deren Ergebnis das gleiche ist (z. B. Regeln
- Sie können auch Großbuchstaben wählen, wenn Sie möchten
- Sie können die Anzahl der Zustände als Eingabe verwenden
- Sie können davon ausgehen, dass die Eingaben in einer bestimmten Reihenfolge vorliegen (z. B. sortiert nach Bundesstaat oder Symbolen).
Die Ausgabe ist eine Liste / Menge / durch neue Zeilen getrennte Ausgabe usw. der Endzustände
- Ordnung spielt keine Rolle
- keine Duplikate (als Set)
Testfälle
Diese Beispiele werden in dem Format sein , description word -> states
wo Sie description
eine Liste von Tupeln (state,symbol,new-states)
:
[] "x" -> []
[] "" -> [0]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abaab" -> [1,2]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abc" -> []
[(0,'p',[0,1]),(0,'g',[2]),(1,'c',[1]),(1,'g',[4]),(1,'p',[2]),(2,'c',[0])] "ppcg" -> [2,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fooooooobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fobarfo" -> [1,2]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobarrf" -> [1]
[(0,'d',[1,2]),(1,'u',[2]),(2,'u',[2,3]),(2,'p',[3]),(3,'p',[3])] "dup" -> [3]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "aab" -> [3,1,4]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "abb" -> [1,2]