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



语言如下。

∑={a,b,c}

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

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

这是正确的吗?

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

您的某些表达是正确的,例如需要拆分aabbcc部分。你有点过度使用括号,但这只是品味问题,而不是正确性问题。

你的基本单位是(aUbUc),代表。字符串的某个位置必须包含ccc,所以让我们从以下内容开始:

(aUbUc)*ccc(aUbUc)*

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

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

但这不允许我们有像acccaaaccc这样的字符串。然而,请注意,它确实要求所有字符串的长度至少为6,因此它满足字符串长度大于5的要求。我将缩写并使用而不是(aUbUc)来缩小它:

(∑*ccc∑*(aaUbbUcc)∑)U(∑∑∑∑*ccc)U(∑∑∑*ccc∑)

请注意额外的s,这是填充其他子表达式所必需的,以确保所有路径的字符串长度都大于5。

直接生成正则表达式的另一种方法是构建与该语言匹配的DFA,然后将其转换为正则表达式。在构建DFA时,您会发现类似的问题,例如需要确保覆盖重叠情况,其中ccc接近字符串的末尾。为了更容易,你可以从一个NFA开始,然后将你的NFA转换为DFA。

最新更新