健康)状况
n您需要编写一个函数来生成括号对的“平衡”组合的完整列表。平衡组合是指每个左括号必须有一个对应的右括号,并且右括号不能出现在对应的左括号之前。
输入数据:
输入是 0 到 15 之间的正整数(实际上是n)(类型int)。
输出
输出应该是平衡括号字符串的完整列表(类型list)(参见示例)。
例子:
0 => [""]
1 => ["()"]
2 => ["()()","(())"]
3 => ["()()()","(())()","()(())","(()())","((()))"]
评价标准:
竞赛语言为Python 3。
最快的解决方案将赢得竞争。
来源:
来源是Codewars All Balanced Parentheses 4 kyu 难度的问题。
聚苯乙烯
如果我以某种方式错误地设置了竞赛格式,我将很乐意接受更正和澄清。
UPD: 以下代码用于打发时间:
import time
def count_time(function, f_arg, how_many_times):
a = time.time()
for i in range(how_many_times):
function(f_arg)
b = (time.time() - a) / how_many_times
return b
结果:
第一个解决方案@MBo:26.08478112220764
第二个解决方案@MBo:(我相信它,我没有检查它,我们假设它是 10,000 秒。)
第一个解决方案@StanislavVolodarskiy:(在第六次迭代时,计算机冻结并且算法未完成)
第二个解决方案@StanislavVolodarskiy:4.338251447677612
总的来说,根据 StanislavVolodarskiy 性质的迭代构建获胜!我接受他的回答。
用于底漆。13 秒生成 1000 万个选项(n=15)。
使用一种算法按字典顺序查找下一个排列(这是一个类似的例子)
搜索的是最右边的左括号,该左括号可以用右括号替换,而不会影响正确的平衡(任何前缀中右括号的数量不应超过左括号的数量)。右侧的变量负责计算余额
bal。如果大于零,那么右边的右括号就多了,左边的左括号也相应多了,那么就可以把当前的左括号改为右括号了。之后,我们从一组左括号中添加按字典顺序排列的最小后缀(它们的数量是根据余额计算的),然后是一组右括号。n=3 的输出:
到堆:根据 Knuth 的说法,我生成了与有效括号序列相对应的二进制单词,但即使不生成字符串,它也一点也不快
通过确定正确的括号顺序进行递归构造。为了加速递归,最后十二个字符的尾部被缓存。缓存大小不超过50 KB ( 12·2 12 )。
按属性迭代构建: