【问题标题】:Regular Expression that describes a language of {0,1} with no alternating 0's描述 {0,1} 语言的正则表达式,没有交替的 0
【发布时间】:2011-05-02 02:34:29
【问题描述】:

它主要在标题中,我所说的交替是指在两次出现的 0 之间有一个 1 或 0。所以不会出现 010000

我正在尝试理解问题的理论性质,因此我更喜欢仅使用串联、并集和闭包(10、1|0 和 10*)的答案。

请注意,这不是一个家庭作业问题,我只是对这个问题感兴趣,所以请不要光顾 cmets。

编辑:将第一段中的措辞从“ 次出现之间”更改为“两次 次出现之间”。

【问题讨论】:

    标签: regex language-agnostic


    【解决方案1】:

    第一个重要的观察是我们可以减少问题:如果允许 S 并且是 1 或以两个 1 结尾,则与任何允许的序列连接的 S 仍然允许。那么什么是有效的 S?

    1. 1 明确在 S 中,任何超过一个 1 的序列将始终以 11 结尾,在 S 中也是如此。
    2. 01 后面只能跟着另一个1,因为0 会给出010。它以11 结尾,有效的 S 也是如此。
    3. 00 后面只能跟11,因为000000010010 都有交替的零。它以11 结尾,有效的 S 也是如此。

    所以这告诉我们任何 S 匹配 ^(1|011|0011)*$。但我们还没有完成,因为还有一些其他序列对 S 无效,但它们本身是允许的序列,因此可以连接到 S。

    • 0
    • 00
    • 01
    • 001

    000 是不允许的,当然,任何更长的东西要么在 S 中,要么本身不允许。

    所以整个正则表达式匹配允许的序列是:

    ^(1|011|0011)*(|0|00|01|001)$
    

    这是零个或多个 S 序列,可选地后跟我们允许的非 S 序列之一。

    【讨论】:

    • 这正是我想要的,感谢您的回答并花时间解释您是如何得出答案的。
    • 精彩的答案,经过深思熟虑和清晰表达。
    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多