语言如下。
∑ = {a,b,c}
L =ω的第二个和第三个字符相同, ω的长度大于5,并且ω包含ccc。
我尝试这样做,但不确定是否正确。得到了以下内容:
(((ccc)(aUbUc) * (a)(a)(aUbUC))U((ccc)(aUbUc) * (b)(b) (aUbUC))U((ccc)(aUbUc) * (c)(c)(aUbUC))
这正确吗?
答案 0 :(得分:0)
不,那是不正确的。例如,您的表达式无法识别字符串aaccc
,因为所有子表达式都要求您的字符串以ccc
开头,这与语言描述所指示的内容不同。
您的某些表达是正确的,例如需要拆分aa
,bb
和cc
部分。您可能会过度使用括号,但这仅是口味问题,而不是正确性。
您的基本单位是(aUbUc)
,代表∑
。字符串必须在其中的某个位置包含ccc
,所以我们从此开始:
(aUbUc)*ccc(aUbUc)*
这是所有包含ccc
的字符串。下一个要求很复杂:倒数第二个字符和倒数第二个字符必须相同。这可能与ccc
部分重叠。如果没有,那就足够了:
(aUbUc)*ccc(aUbUc)*(aaUbbUcc)(aUbUc)
但是,这不允许我们使用accca
或aaccc
之类的字符串。但是请注意,它确实要求所有字符串的长度至少为6,因此它满足了字符串长度必须大于5的要求。我将简化并使用∑
而不是{{1} }使其更小:
(aUbUc)
请注意额外的(∑*ccc∑*(aaUbbUcc)∑)U(∑∑∑∑*ccc)U(∑∑∑*ccc∑)
,它们需要填充其他子表达式以确保所有路径的字符串长度都大于5。
直接提供正则表达式的另一种方法是构建与该语言匹配的DFA,然后构建convert it to a regular expression。在构建DFA时,您会遇到类似的问题,例如需要确保覆盖∑
位于字符串结尾附近的重叠情况。为了简化操作,您可以从NFA开始,然后将NFA转换为DFA。