我使用正则表达式3d数组制作NFA,例如(01 *)表达式。我明白了:
[[FROM,TO,TRANSITION]]
[['q0', 'q1', '0'], ['q1', 'q2', ':e:'] ,['q1', 'q4', ':e:'] ,
['q2', 'q3', '1'], ['q3', 'q2', ':e:'], ['q3', 'q4', ':e:']
如何编写可以测试满足此自动机的字符串的方法?例如,"011111"
将返回q0 q1 q2 q3 q2 q3 q2 q3 q2 q3 q2 q3 q4
答案 0 :(得分:1)
您可以将自动机转换为DFA(之后检查变得微不足道)。这种方法很有用,因为NFA很小,但你要测试的字符串数量非常大。
您还可以构建一个新图形,其中每个顶点都是对的(NFA的状态,字符串中的位置)。如果它是一个epsilon过渡,则每个位置的状态和另一个状态之间存在边缘。如果自动机中(s, pos) -> (s', pos + 1)
转换的字符与字符串中位置s->s'
的字符匹配,则还有一个边pos
。
构建图形后,您只需检查至少一个终端状态(t, string.length())
是否可以访问一对t
(您可以使用任何图形遍历算法进行检查,例如深度优先搜索)。