0

首先,很明显这是功课,我相信我已经尽职尽责。现在我不希望在银盘上将解决方案交给我,只需朝正确的方向轻推就可以了,所以让我开始吧:

问题是:

字母表 {0, 1} 上的所有字符串,其中每个奇数长度的 0 块后面紧跟一个偶数长度的 1 块,每个偶数长度的 0 块后面紧跟一个奇数长度的 1 块。

我一直在做的是一块一块地工作,首先是:

仅匹配偶数 0,奇数 1: ^[^0]*((00)+1(11)*)*$

仅匹配奇数 0,偶数 1: ^[^0]*(0(00)*(11)+)*$

把它们放在一起: ^[^0]*((00)+1(11)*)*(0(00)*(11)+)*$

我认为这最初是有效的,但它只适用于:

  • 001011
  • 001000010110001111等
  • 基本上任何其他出现的顺序与它在有意义的表达式中出现的顺序相同。

并不是:

  • 011001等

我一直坚持的是弄清楚如何让它适用于上面列出的案例。我试着做一个积极的前瞻,但它似乎没有奏效。

有没有人有任何指示?

4

2 回答 2

1

将它们结合起来^[^0]*((00)+1(11)*)*(0(00)*(11)+)*$只会让你成功一半,因为它只有在所有奇 0 偶 1 块都在所有偶 0 奇 1 块之前才有效。您想要的是一个匹配零个或多个 ( [^0]*) 的正则表达式,后跟任何奇偶和偶奇块的混合 - 有点像(odd-even|even-odd)(odd-even|even-odd)...,但对于奇偶或偶奇的任意数量(零或更多) . 你怎么能做到这一点?

于 2013-04-02T22:49:10.887 回答
0

你肯定在正确的轨道上。

仅匹配偶数 0,奇数 1:^(00)+1(11)*$

仅匹配奇数 0,偶数 1:^0(00)*(11)+$

把它们放在一起:^(((00)+1(11)*)|(0(00)*(11)+))+$

只是为了好玩,这里有一个较短的输入1, 111, 11111... 除非你把零算作偶数。

^((00)*(01)?1(11)*)+$
于 2013-04-02T22:46:48.207 回答