dawrehxyz icon

Untitled

dawrehxyz | PRO | 11/22/16 05:32:30 PM UTC | 0 ⭐ | 372 👁️ | Never ⏰ | []
Java |

4.53 KB

|

None

|

0 👍

/

0 👎

import java.util.List;
import java.util.ArrayList;
 
public class DFA
{
    private boolean cyclesInPath;
    private int currentState;
    private int maxCount;
    private boolean stopAddingStrings;
    private ArrayList<Integer> acceptedStates = new ArrayList<>();
    private ArrayList<Transition> transitions = new ArrayList<>();
    private ArrayList<String> acceptedStrings = new ArrayList<>();
 
    private int tempFrom;
    private int tempTo;
    private int tempC;
 
    public DFA(int stateCount, int startState)
    {
        cyclesInPath = false;
        currentState = startState;
        tempFrom = -1;
        tempTo = -1;
        tempC = '-';
        stopAddingStrings = false;
    }
 
    public void setAccepting(int state)
    {
        acceptedStates.add(state);
    }
 
    public void addTransition(int from, int to, char c)
    {
        if(tempFrom == -1 && tempTo == -1 && tempC == '-')
        {
            transitions.add(new Transition(from, to));
            transitions.get(transitions.size() - 1).addC(c);
            tempFrom = from;
            tempTo = to;
            tempC = c;
        }
        else if(from == tempFrom && to == tempTo)
            transitions.get(transitions.size() - 1).addC(c);
        else
        {
            transitions.add(new Transition(from, to));
            transitions.get(transitions.size() - 1).addC(c);
            tempFrom = from;
            tempTo = to;
            tempC = c;
        }
    }
 
    public List<String> getAcceptingStrings(int maxCount)
    {
        this.maxCount = maxCount;
        work(currentState, 0, "");
        return acceptedStrings;
    }
 
    private void work(int currentState, int cycle, String path)
    {
        if(acceptedStrings.size() >= maxCount)
            return;
 
        for(int a = 0; a < acceptedStates.size(); a++)
        {
            if(currentState == acceptedStates.get(a) && path != "")
            {
                stopAddingStrings = false;
                addValidStrings(path, "");
                for(int b = 0; b < transitions.size(); b++)
                {
                    transitions.get(b).visited = 0;
                }
                break;
            }
        }
 
        for(int a = 0; a < transitions.size() && acceptedStrings.size() < maxCount; a++)
        {
            if(a > 0 && !cyclesInPath) break;
            for(int b = 0; b < transitions.size() && acceptedStrings.size() < maxCount; b++)
            {
                Transition transition = transitions.get(b);
                if(currentState == transition.from)
                {
                    if(cycle < transition.visited)
                    {
                        cyclesInPath = true;
                        return;
                    }
                    transition.visited++;
                    work(transition.to, a, path + b);
                }
                /*if(b == transitions.size() - 1)
                {
                    return;
                }*/
            }
        }
    }
 
    //Adds all valid strings for the current path.
    private void addValidStrings(String path, String word)
    {
        int index = path.charAt(0) - '0';
        path = path.substring(1);
        for(int a = 0; a < transitions.get(index).chars.size(); a++)
        {
            String tempword = word;
            for(int b = 0; b <= a; b++)
            {
                tempword += transitions.get(index).chars.get(b);
            }
            if(path.compareTo("") != 0)
            {
                addValidStrings(path,tempword);
                if(stopAddingStrings) return;
            }
            else
            {
                if(acceptedStrings.size() >= maxCount)
                {
                    stopAddingStrings = true;
                    return;
                }
                acceptedStrings.add(tempword);
            }
        }
    }
 
    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
{
    ArrayList<Character> chars;
    int from;
    int to;
    int visited;
 
    Transition(int from, int to)
    {
        chars = new ArrayList<>();
        this.from = from;
        this.to = to;
        visited = 0;
    }
 
    public void addC(char c)
    {
        chars.add(c);
    }
}

Comments