【发布时间】:2011-05-02 02:34:29
【问题描述】:
它主要在标题中,我所说的交替是指在两次出现的 0 之间有一个 1 或 0。所以不会出现 010 或 000。
我正在尝试理解问题的理论性质,因此我更喜欢仅使用串联、并集和闭包(10、1|0 和 10*)的答案。
请注意,这不是一个家庭作业问题,我只是对这个问题感兴趣,所以请不要光顾 cmets。
编辑:将第一段中的措辞从“ 次出现之间”更改为“两次 次出现之间”。
【问题讨论】:
它主要在标题中,我所说的交替是指在两次出现的 0 之间有一个 1 或 0。所以不会出现 010 或 000。
我正在尝试理解问题的理论性质,因此我更喜欢仅使用串联、并集和闭包(10、1|0 和 10*)的答案。
请注意,这不是一个家庭作业问题,我只是对这个问题感兴趣,所以请不要光顾 cmets。
编辑:将第一段中的措辞从“ 次出现之间”更改为“两次 次出现之间”。
【问题讨论】:
第一个重要的观察是我们可以减少问题:如果允许 S 并且是 1 或以两个 1 结尾,则与任何允许的序列连接的 S 仍然允许。那么什么是有效的 S?
1 明确在 S 中,任何超过一个 1 的序列将始终以 11 结尾,在 S 中也是如此。01 后面只能跟着另一个1,因为0 会给出010。它以11 结尾,有效的 S 也是如此。00 后面只能跟11,因为0000、0001 和0010 都有交替的零。它以11 结尾,有效的 S 也是如此。所以这告诉我们任何 S 匹配 ^(1|011|0011)*$。但我们还没有完成,因为还有一些其他序列对 S 无效,但它们本身是允许的序列,因此可以连接到 S。
00001001000 是不允许的,当然,任何更长的东西要么在 S 中,要么本身不允许。
所以整个正则表达式匹配允许的序列是:
^(1|011|0011)*(|0|00|01|001)$
这是零个或多个 S 序列,可选地后跟我们允许的非 S 序列之一。
【讨论】: