华为面试题:求n对括号的所有合法表达式(两种简洁做法)
来源:互联网 发布:济南seo小武 编辑:程序博客网 时间:2024/04/27 16:02
这个题目其实以前写过,但是现在再看,有了简洁有效的多的解法:一个DFS就搞定了。
def construct(n): def create(num1,num2,exp): if num1+num2==2*n:assert(num1==n);print(exp) if num1<n :create(num1+1,num2,(exp+'(')[::]) if num1>num2:create(num1,num2+1,(exp+')')[::]) create(0,0,'')
同时可以分析一下n对括号的合法表达式有多少种?
F(n)=∑n−1k=0F(k)∗F(n−1−k) ,具体思路就是用更小的括号构造出更多的括号,但是为什么是n-1-k呢,因为两边的括号可能会因为对称而重复比如:
()()()|()和()|()()()其实是两个构造方案,但是最后结果一致。
所以人为的为左边的表达式外层添加一个括号,这样就保证不会重复了。所以只需要构造n-k-1个括号即可。如:
′(′()()′)′|()和′(′()′)′|()() 因为我特意添加的括号,保证不会出现不同的构造方法对应相同的表达式。
根据这个思路,可以更快的求出n对括号的所有合法表达式,测试了一下发现速度比上面的快5倍左右,有点类似于动态规划的思路。但是不是求最优解。
def quick_construct(n): ans = {0:[''],1:['()']} for num in range(2,n+1): for k in range(0,num): for first in ans[k]: ans.setdefault(num,[]).extend \ (['('+first+')'+second for second in ans[num-k-1]]) return '\n'.join(ans[n])
0 0
- 华为面试题:求n对括号的所有合法表达式(两种简洁做法)
- 小米面试题:N对括号的所有合法状态
- N对括号所有的合法状态
- 生成n对括号的所有合法排列
- N对括号的合法组合
- 【递归】输出给定的n对括号对的所有合法序列
- 【卡特兰数】有N对括号,输出所有合法的组合
- 打印包含n个括号的所有合法的组合
- 卡特兰数(Catalan)应用:输出所有N对合法括号序列和输出所有已知进栈序列的合法出栈序列
- [经典面试题]给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数
- 生成n对括号的合法全排列
- n对括号组合的所有情况
- n对括号可以有多少种匹配排列方式(算法面试题)
- 笔面试题之 求小于N的质数中和为N的质数对
- N 皇后的两种做法
- 输出所有的合法的括号组合
- 求出对应N的所有合法匹配括号 (DFS)---小米笔试题
- 有N对左右括号,问合法排列有多少种?对解法有点不理解求教!
- oracle数据库建立索引的原则
- Bugly Android 快速接入使用文档
- 两个素数
- tcp协议中syn ack fin各有什么作用
- java中引用三大类型
- 华为面试题:求n对括号的所有合法表达式(两种简洁做法)
- java数据库系统项目开发实践笔记
- word_count
- Fragment源码阅读笔记
- 第二个代码模型(数据表与简单Java类映射)
- c++文件读写
- 右补齐
- 深入简单Java类与数据表之间多对多映射
- XZ_iOS之UITableView的代理方法的执行顺序