给定正则语言,找到正则表达式

时间:2019-02-04 05:11:28

标签: regular-language

语言如下。

∑ = {a,b,c}

L =ω的第二个和第三个字符相同, ω的长度大于5,并且ω包含ccc。

我尝试这样做,但不确定是否正确。得到了以下内容:

(((ccc)(aUbUc) * (a)(a)(aUbUC))U((ccc)(aUbUc) * (b)(b) (aUbUC))U((ccc)(aUbUc) * (c)(c)(aUbUC))

这正确吗?

1 个答案:

答案 0 :(得分:0)

不,那是不正确的。例如,您的表达式无法识别字符串aaccc,因为所有子表达式都要求您的字符串以ccc开头,这与语言描述所指示的内容不同。

您的某些表达是正确的,例如需要拆分aabbcc部分。您可能会过度使用括号,但这仅是口味问题,而不是正确性。

您的基本单位是(aUbUc),代表。字符串必须在其中的某个位置包含ccc,所以我们从此开始:

(aUbUc)*ccc(aUbUc)*

这是所有包含ccc的字符串。下一个要求很复杂:倒数第二个字符和倒数第二个字符必须相同。这可能与ccc部分重叠。如果没有,那就足够了:

(aUbUc)*ccc(aUbUc)*(aaUbbUcc)(aUbUc)

但是,这不允许我们使用acccaaaccc之类的字符串。但是请注意,它确实要求所有字符串的长度至少为6,因此它满足了字符串长度必须大于5的要求。我将简化并使用而不是{{1} }使其更小:

(aUbUc)

请注意额外的(∑*ccc∑*(aaUbbUcc)∑)U(∑∑∑∑*ccc)U(∑∑∑*ccc∑) ,它们需要填充其他子表达式以确保所有路径的字符串长度都大于5。

直接提供正则表达式的另一种方法是构建与该语言匹配的DFA,然后构建convert it to a regular expression。在构建DFA时,您会遇到类似的问题,例如需要确保覆盖位于字符串结尾附近的重叠情况。为了简化操作,您可以从NFA开始,然后将NFA转换为DFA。