我有以下语法:
S - > S {S} S | null
这里的null意味着什么都没有代替S. 我需要生成这个语法生成的所有可能的2n括号字符串。 我试过编码但程序内存不足。有人可以帮我编码2n个括号的语法吗?
提前多多感谢
答案 0 :(得分:1)
首先,证明该语法生成平衡花括号的所有字符串。
(提示:首先证明S -> S{S} | null
生成所有这些字符串。)
然后只需编写一个函数来生成所有这些:
function generate(num_opens, num_closes, string_so_far, N)
if (num_opens + num_closes == N)
print string_so_far;
return;
if (num_opens > num_closes)
generate(num_opens, num_closes+1, string_so_far . '}', N)
generate(num_opens+1, num_closes, string_so_far . '{', N)
generate(0, 0, N)
这可能是也可能不是问题的“精神”。
答案 1 :(得分:0)
为您准备了一些伪代码:
function grammar: S(string), n(int), generatedStrings(collection)
if (|S| == 2*n)
// Store in generatedStrings
return
else if (|S| > 2*n)
return
grammar(S + '{}', n, generatedStrings)
grammar(S +'{'+ S +'}', n, generatedStrings)
grammar(S +'{'+ S +'}'+ S, n, generatedStrings)
grammar('{'+ S +'}'+ S, n, generatedStrings)
grammar('{'+ S +'}', n, generatedStrings)
grammar('{}'+ S, n, generatedStrings)
然后你只需要一些机制来确保不向生成的字符串集添加重复项。我会使用一个集合类型的数据结构(换句话说,一个只允许存储每个值之一的结构)。