【问题标题】:Given Regular Language, find Regular Expression给定正则语言,找到正则表达式
【发布时间】:2019-02-04 22:28:18
【问题描述】:

语言如下。

∑={a,b,c}

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

我试过这样做,但我不确定它是否正确。得到以下信息:

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

这对吗?

【问题讨论】:

    标签: regular-language


    【解决方案1】:

    不,这是不正确的。例如,您的表达式无法识别字符串 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,然后 convert it to a regular expression。在构建 DFA 时,您会发现类似的问题,例如需要确保覆盖重叠情况,其中ccc 位于字符串末尾附近。为了使这更容易一些,您可以从 NFA 开始,然后将您的 NFA 转换为 DFA。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-25
      • 2013-11-18
      • 1970-01-01
      • 2011-01-31
      • 2011-11-29
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      相关资源
      最近更新 更多