查找表示由{
a,
b
}构成的字符串的正则表达式,其中a
的数量可被6整除,b
的数量可以被8
整除。
我尝试创建一个接受此类字符串的DFA。我的想法是使用所有余数mod 6和mod 8导致总共48个余数。因此,DFA中的每个州都是一对(r, s)
,其中r
从0到6不等,s
从0到7不等。开始状态(以及接受状态)是{{1}我们可以通过注意到如果我们输入(0, 0)
状态"a"
转换为(r, s)
并且输入(r + 1, s)
,则转换为状态{{1 }}
然而,使用48个状态的DFA太难了,我不确定是否可以通过手动使用DFA最小化算法来最小化。
我真的不确定我们怎么能得到一个代表这种字符串的正则表达式。
答案 0 :(得分:1)
如果允许使用前瞻:
^(?=b*((ab*){6})+$)a*((ba*){8})+$
匹配字符串的示例:bbaabbaabbaabb
想法很简单:我们知道如何匹配具有a
s的数字的字符串可被6整除 - ^((b*ab*){6})+$
,我们也知道如何匹配具有b
s数的字符串的字符串8 - ^((a*ba*){8})+$
。所以我们只是将一个正则表达式用于预测,另一个用于匹配部分。
如果您 需要匹配仅包含a
s或仅包含b
s的字符串,则以下正则表达式将执行:
^(?=b*((ab*){6})*$)a*((ba*){8})*$
匹配字符串的示例:aaaaaa
,bbbbbbbb
,bbaabbaabbaabb