朋友告诉我以下挑战问题。
将{A, T, G, C}
作为我们的字母表,我们希望通过以下递归模式定义知道具有指定长度n
的有效短语数:
pat=pat1pat2
,即将两个模式连接在一起以形成新模式pat
。pat=(pat1|pat2)
,即选择其中一种模式pat1
或pat2
以形成新模式pat
。pat=(pat1*)
,即重复模式pat1
任意次数(可以为0)以形成新模式pat
。如果可以通过上述模式定义形成,则由字母集{A, T, G, C}
形成的短语被认为满足模式;它的长度是字母数。
一些例子:
((A|T|G)*)
和n=2
,有效短语的数量
是9,因为有AA
,AT
,AG
,TA
,TT
,TG
,GA
,{{ 1}},
GT
。GG
和(((A|T)*)|((G|C)*))
,有效短语的数量
是8,因为有n=2
,AA
,AT
,TA
,TT
,GG
,GC
,{{ 1}}。CG
和CC
,有效短语的数量
是3,因为有((A*)C(G*))
,n=3
,AAC
。如果你曾经见过这个问题以及你的想法,请指出这个问题的根源。
答案 0 :(得分:0)
字母A,C,G和T的选择让我想到DNA碱基对序列。但正如thiton所写,显然这个问题已从常规语言研究中解脱出来。谷歌“常规语言枚举”,你应该找到大量的研究论文和代码,以帮助你入门。如果为这些模式计算匹配字符串的数量不是#P-complete问题,我会感到惊讶,所以期望n中的运行时指数。