[英]Regular expression for the following condition
為字母表 {a,b} 定義一個正則表達式,其中非空的 a 的子序列總是偶數,b 的子序列總是奇數。
我有這樣的東西,但我認為它的工作原理是表達式中 a 和 b 的數量分別為偶數和奇數,而不考慮 a 的每個子序列必須是偶數而 b 必須是奇數:
(a|b(aa|bb) (ab|ba)) (aa|bb|(ab|ba)(aa|bb) (ab|ba))*
我會走很長的路來回答,看看我是否明白你所做的......
我們可以為這種語言創建一個 DFA,如下所示:
/---a---\ /---\
| | | | a,b
V | V |
----->q0--a-->q1--b-->q2---/
| ^ ^
b | |
| a |
V | |
/->q3-------/ |
| | |
| b |
b | |
| V |
\--q4------a--------/
在這個 DFA 中,狀態 q0 和 q3 正在接受,因為我們剛剛看到一個奇數串 b 或一個偶數串 a,我們還沒有搞砸並落在 q2,我們也不需要額外的 a/b獲得偶數/奇數連勝。
有了 DFA,我們可以為導致每個 state 的字符串編寫一些方程式:
(q0) = e + (q1)a
(q1) = (q0)a + (q3)a
(q2) = (q1)b + (q4)a + (q2)(a+b)
(q3) = (q0)b + (q4)b
(q4) = (q3)b
我們想求解 (q0) 和 (q3)。 我們幾乎可以忽略 (q2),因為我們不關心未接受的字符串並且它對獲取其他任何地方都沒有幫助。
(q0) = e + (q1)a
(q1) = (q0)a + (q3)a
(q3) = (q0)b + (q4)b
(q4) = (q3)b
(q0) = e + (q1)a
(q1) = (q0)a + (q3)a
(q3) = (q0)b + (q3)bb
= (q0)b(bb)*
(q0) = e + (q1)a
(q1) = (q0)a + (q0)b(bb)*a
= (q0)[a + b(bb)*a]
(q0) = e + (q0)[a + b(bb)*a]a
= e + (q0)[aa + b(bb)*aa]
= [aa + b(bb)*aa]*
因此,正則表達式 [aa + b(bb) aa]給出指向 q0 的字符串,而 [aa + b(bb)*aa] b(bb)給出指向 q3 的字符串。 這些的聯合是:
[aa + b(bb)*aa]* + [aa + b(bb)*aa]*b(bb)*
= [aa + b(bb)*aa]*[e + b(bb)*]
這與您的表達方式不太接近,但這並不意味着您的表達方式是錯誤的……但我認為您的表達方式是錯誤的,因為如果我沒看錯的話,我們可以得出以下推導:
(a|b(aa|bb)(ab|ba)) (aa|bb|(ab|ba)(aa|bb)(ab|ba))* // initial
(a|b(aa|bb)(ab|ba)) // take * = 0
a // choose a
而且 a 不是您想要的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.