考虑正则表达式R =(a + b)*(aa + bb)(a + b)*
下面给出的哪个正则表达式定义的语言与正则表达式R定义的语言相同?
(A) (a(ba)* + b(ab)*)(a + b) +
(B) (a(ba)* + b(ab)*)*(a + b)*
(C) (a(ba)*(a + bb)+ b(ab)*(b + aa))(a + b)*
(D) (a(ba)*(a + bb)+ b(ab)*(b + aa))(a + b) +答案: (C)
说明: <!– A接受ab但给定的不接受
B空可以被接受,而不是给定–>
可以通过以下方式简化上述DFA:解析状态B和状态C的循环,并删除最终状态下的额外过渡,如下所示:
为了从B到达最终状态,我们可以使用字母“ a”移至状态D,或使“ bb”移至状态E。
同样,要从C到达最终状态,我们可以让字母“ b”移至状态E,或使字母“ aa”移至状态D。
因此,正则表达式为:
(a(ba)*(a + bb)+ b(ab)*(b + aa))(a + b)*
a(ba)*(a + bb):从A移至B,然后从B移至任何一种最终状态
b(ab)*(b + aa):从A移到C,然后从C移到任何一种最终状态注意:对于此类问题,我们也可以使用“消除期权”方法,即如果我们拒绝了期权,
至少找到不验证正则表达式的字符串。
选项(A)接受ab,但给定的正则表达式则不接受。
选项(B)接受一个空字符串,但给定的正则表达式则不接受。
选项(D)不接受aa,但给定的正则表达式可以接受。
该解决方案由Yashika Arora提供
这个问题的测验