我有一张NFA图片,需要从NFA中获取结果正则表达式。我第一次有 b a *,但意识到这不起作用。我认为它必须从(a | b)开始,但我不确定从那里开始。
答案 0 :(得分:1)
有关如何将NFA翻译成正则表达式的一般方法,但我不记得如何。但是在你的情况下,我们得到了以下事实的帮助:所有长度大于1的循环都从状态0开始。所以我们可以使用以下正则表达式;
(b?ab|aab|ab+aa?b)*(ba?|aa|ab+aa?)
解释
如果状态0是唯一的匹配状态,则 (b?ab|aab|ab+aa?b)*
是正则表达式。由于所有长循环都通过状态0,因此这是我们正则表达式的前缀。
(ba?|aa|ab+aa?)
是我们的正则表达式,如果b链接回到状态0(从状态1和状态4)不存在。因为我们在前一个循环之后处于状态0,这将我们带到一个接受状态。
将两者组合在一起,我们有一个正则表达式,它查找返回状态0的跟踪任意次数,然后从状态0移动到接受状态。
从(a|b)
开始是错误的方法,因为状态1和3几乎没有共同点,如何允许你从a继续进行,这与你允许从b继续进行的方式不同。