public static bool Run(Automaton a, string s) { if (a.IsSingleton) { return(s.Equals(a.Singleton)); } if (a.IsDeterministic) { var p = a.Initial; foreach (var t in s) { var q = p.Step(t); if (q == null) { return(false); } p = q; } return(p.Accept); } var states = a.GetStates(); Automaton.SetStateNumbers(states); var pp = new LinkedList <State>(); var ppOther = new LinkedList <State>(); var bb = new BitArray(states.Count); var bbOther = new BitArray(states.Count); _ = pp.AddLast(a.Initial); var dest = new List <State>(); var accept = a.Initial.Accept; foreach (var c in s) { accept = false; ppOther.Clear(); bbOther.SetAll(false); foreach (var p in pp) { dest.Clear(); p.Step(c, dest); foreach (var q in dest) { if (q.Accept) { accept = true; } if (!bbOther.Get(q.Number)) { bbOther.Set(q.Number, true); _ = ppOther.AddLast(q); } } } var tp = pp; pp = ppOther; ppOther = tp; var tb = bb; bb = bbOther; bbOther = tb; } return(accept); }