import java.util.List; import java.util.ArrayList; public class DFA { private int currentState; private int maxCount; private final int stateCount; private final int startState; private ArrayList acceptedStates = new ArrayList<>(); private ArrayList transitions = new ArrayList<>(); private ArrayList acceptedStrings = new ArrayList<>(); public DFA(int stateCount, int startState) { this.stateCount = stateCount; this.startState = startState; currentState = startState; } public void setAccepting(int state) { acceptedStates.add(state); } public void addTransition(int from, int to, char c) { transitions.add(new Transition(from,to,c)); } public List getAcceptingStrings(int maxCount) { this.maxCount = maxCount; work(currentState, currentState, "", false); work(currentState, currentState, "", true); return acceptedStrings; } private void work(int currentState, int previousState, String word, boolean cycle) { if(acceptedStrings.size() >= maxCount) return; for(int a = 0; a < acceptedStates.size(); a++) { if(currentState == acceptedStates.get(a) && word != "" && !duplicate(word)) { acceptedStrings.add(word); break; } } for(int a = 0; a < transitions.size() && acceptedStrings.size() < maxCount; a++) { Transition transition = transitions.get(a); if(currentState == transition.from) { if(transition.from == transition.to && !cycle) continue; word += transition.c; transition.visited = true; work(transition.to, transition.from, word, false); work(transition.to, transition.from, word, true); transition.visited = false; } } } private boolean duplicate(String s) { for(int a = 0; a < acceptedStrings.size(); a++) { if(acceptedStrings.get(a).compareTo(s) == 0) { return true; } } return false; } } class Transition { int from; int to; char c; boolean visited; Transition(int from, int to, char c) { this.from = from; this.to = to; this.c = c; visited = false; } }