这是一个研究项目的 DFA。我们手动创建了 DFA。我们对什么是与 DFA 对应的正则表达式感兴趣。当然,可以有多个正则表达式与之对应;我们更喜欢更简单的。

这是一个研究项目的 DFA。我们手动创建了 DFA。我们对什么是与 DFA 对应的正则表达式感兴趣。当然,可以有多个正则表达式与之对应;我们更喜欢更简单的。

您在 B 和 E 的自循环上错过了 DFA 中的标签。但是因为您说对于给定的 DFA,所以标签的唯一选择是0在两个循环上。
DFA 的正确正则表达式是:
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
简要说明:
您只有一个最终状态,即D。因此,如果字符串以D. 你是否注意到传入的边缘D被标记1并且D有一个标记为自循环0。
开始状态是A这样的字符串可以以0或以开头1。实际上,A 上有两个循环。一个从上图开始0 并穿过上图。
上层循环的 RE 是: 00* 10*1
要理解这一点:
0 0* 1 0* 1
A-E loop on E E-F loop on F F-A
在下图中从A到。DRE 是1 (0 + 10)* 1 1
为了理解这一点:
1 (0 + 10)* 1 1
A - B loop on B B-C C-D
DFA 的完整 RE 是:(答案)
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
要理解这一点:
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
^ ^ ^
upper loop A to D loop on D * for loop on D
( 0 + 1 (00* 10*1)* 1 (0 + 10)* 1 1 )*
^ D-A A-A A-B loop on B, B-c c-D
self loop on D
按照@RedBaron 的评论编辑01110100110此正则表达式是否生成字符串:
首先检查它是否被 DFA 接受:
A--0--> E--1---> F--1---> A---1---> B--0---> B---1--->C ---0--- ->B---0---> B--1-->C---1---> D---0--->D</p>
是的字符串被 DFA 接受。
如何从我在答案中给出的 RE 生成,下面我已经对齐了 RE 和字符串。
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
0^ 1^ 1 1 0100 1 1 0
只有您可能必须了解的困难:如何(0 + 10)*生成0100?对于以下检查:
(0 + 10)*重复三遍:
(0 + 10)(0 + 10)(0 + 10)
0 10 0
杰克,这个 DFA 基本上可以有两个正则表达式。第一个可以是 AB*CD*A,第二个可以是 AE*F*
10*110*用于从 ABCD 转换而没有 cB 中的循环
1(0*(10)*)*110*我认为也涵盖了 C 和 B 之间的循环
0+10*1是来自 AEF 的循环。所以你可以在这两个表达式前面加上前缀
你得到(0+10*1)*10*110*没有循环和(0+10*1)*1(0*(10)*)*110*它
因此最终的表达式是
(0+10*1)*1(0*(10)*)*110*
用于从 A 到 D 的过渡
最后到达状态 D 你可以得到 a 1,达到A并重复整个事情
((0+10*1)*1(0*(10)*)*110*)(1((0+10*1)*1(0*(10)*)*110*))*
查看此 DFA 的一些有效和无效字符串的实际操作
澄清- 此正则表达式基于 PCRE 接受的正则表达式。So+表示字符串出现 1 次或多次,*表示出现 0 次或多次,而|表示OR
编辑(0*(10)*)*可以写得更好((0|(10))*感谢@grijesh-chauhan 为我指明了那个方向)。所以RE(基于PCRE)将是
((0+10*1)*1(0|(10))*110*)(1((0+10*1)*1(0|(10))*110*))*