具有偶数a和奇数no的字符串的正则表达式

时间:2010-09-13 07:50:42

标签: string language-theory regular-language

我在解决问题时遇到问题: - 它是一个任务,我解决了它,但它似乎太长而模糊,可以任何人帮助我......

具有偶数个a和奇数个b的字符串的正则表达式,其中字符集= {a,b}。

13 个答案:

答案 0 :(得分:19)

执行此操作的一种方法是通过两个正则表达式传递它,确保它们都匹配(假设您想要使用正则表达式,请参阅下面的替代方法):

^b*(ab*ab*)*$
^a*ba*(ba*ba*)*$

其他任何东西(事实上,甚至是那个)很可能只是一种聪明的尝试,通常是一次大规模的失败。

第一个正则表达式确保混合中的任何位置都有a b偶数(之前,之后和之间)。

第二个是类似的,但由于起始b,确保{em>奇数的a*ba*个数。


远远更好的方法是完全忽略正则表达式,只需按如下方式运行字符串:

def isValid(s):
    set evenA to true
    set oddB to false
    for c as each character in s:
        if c is 'a':
            set evenA to not evenA
        else if c is 'b':
            set oddB to  not oddB
        else:
            return false
    return evenA and oddB

虽然正则表达式是一个很棒的工具,但它们并不适合所有东西,因为它们的可读性和可维护性降低,它们变得不那么有用了。


对于它的价值,单正则表达式的答案是:

(aa|bb|(ab|ba)(aa|bb)*(ba|ab))*(b|(ab|ba)(bb|aa)*a)

但是,如果我发现团队中的任何人真的使用了这样的怪物,他们会被送回去做。

这来自Greg Bacon的一篇论文。有关实际的内部工作原理,请参阅here

答案 1 :(得分:3)

Even-Even = (aa+bb+(ab+ba)(aa+bb)*(ab+ba))*

(偶数偶数的Aas和b的偶数都相等)

a的偶数b =偶数b偶数

这应该可行

答案 2 :(得分:1)

  1. (bb)*a(aa)*ab(bb)*
  2. ab(bb)* a(aa)*
  3. b(aa)*(bb)*    。
       。
       。
       。
       。
       。
  4. 可能有很多这样的正则表达式。你还有其他任何条件,比如“以a开头”或类似的东西(奇怪的'b'甚至'a'除外)?

答案 3 :(得分:0)

我会这样做:

  • 正则表达式甚至匹配符号 a ,然后是 b 的序列,然后符号 a 再次,然后是 b 的另一个序列,这样就有了偶数个 b

甚至 - > ( a bb )* a bb )* | a b bb )* a b bb )*)

  • 正则表达式奇数 b 的奇数总数相同:

奇数 - > ( a b bb )* a bb )* | a bb )* a b bb )*)

偶数个 a 的字符串和 b 的奇数:

  • 以奇数个 b 开头,然后是偶数模式中偶数个奇数模式;
  • 或以偶数个 b 开头,然后是偶数模式中奇数个奇数模式。< / LI>

请注意,偶数不会影响字符串中 a / b 的均匀度/奇数。

正则表达式 - &gt; (

b bb )* 偶数* 奇数 偶数* < strong>奇数)* 偶数*

|

bb )* 偶数* 奇数 偶数* 奇数 <强>偶* 奇数)* 偶*

当然,可以在最终的正则表达式中替换偶数奇数的每一个出现以获得单个正则表达式。

很容易看出满足这个正则表达式的字符串确实会有偶数个 a (因为符号 a 只出现在偶数< / strong>和奇数子目标,并且每个都使用正好两个 a 的)和奇数个 b (第一种情况: 1 b +偶数 b 's偶数奇数;第二种情况:偶数 b 's +奇数奇数)。

具有偶数 a 和奇数 b 的字符串将满足此正则表达式,因为它以零或更多 b开头,然后是[one a ,零个或多个 b ,另外一个 a ,零个或多个 b 的],零次或多次。

答案 4 :(得分:0)

高级建议:为语言构建一个确定性有限自动机---非常简单,编码状态中ab s的奇偶校验,{{1编码甚至nr。 q0 s甚至nr。 a s,并相应地转换---,然后将DFA转换为正则表达式(通过使用众所周知的算法或#34;从头开始&#34;)。

这里的想法是利用DFA(常规语言的算法描述)和正则表达式(常规语言的代数描述)之间易于理解的等价。

答案 5 :(得分:0)

这个正则表达式使用偶数a和偶数b的所有字符串

r1=((ab+ba)(aa+bb)*(ab+ba)+(aa+bb))*

现在获得偶数和奇数b的正则表达式

r2=(b+a(aa+bb)*(ab+ba))((ab+ba)(aa+bb)*(ab+ba)+(aa+bb))*

答案 6 :(得分:0)

正则表达式如下:

tot = result + tot;

答案 7 :(得分:0)

对于a和b的偶数,我们有正则表达式:

E = { (ab + ba) (aa+bb)* (ab+ba) }*

对于a的偶数和b的奇数,我们要做的就是在上述表达式b中添加一个额外的E

所需的正则表达式为:

E = { ((ab + ba) (aa+bb)* (ab+ba))* b ((ab + ba) (aa+bb)* (ab+ba))* }

答案 8 :(得分:0)

的结构化的方式来做到这一点是使一个转换图,并从它建立正则表达式。 这种情况下的正则表达式将是

(a((b(aa)*b)*a+b(aa)*ab)+b((a(bb)*a)*b+a(bb)*ba))b(a(bb)*a)*

看起来比较复杂,但它涵盖可能出现的所有可能的情况。

答案 9 :(得分:-1)

答案是(aa + ab + ba + bb)* b(aa + ab + ba + bb)*

答案 10 :(得分:-1)

(bb)* b(aa)* +(aa)* b(bb)*

这是处理所有类型字符串的答案,其中包含奇数b甚至是a。

答案 11 :(得分:-2)

如果是a的偶数,则后跟奇数个b (aa)* b(bb)*应该起作用

如果是任何顺序 (aa)* b(bb)* + b(bb)(aa)应该有效

答案 12 :(得分:-2)

所有字符串甚至没有b的奇数和奇数 (((aa + bb)* b(aa + bb)*)+(A +((a + b)b(a + b))*))*

这里A代表空字符串。 A可以忽略不计。

如果有任何错误,请将其指出。