Different Ways to Add Parentheses
开始每天坚持刷OJ和Paper吧。
今天的题目是 Different Ways to Add Parentheses :
Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are +
, -
and *
.
Example 1:
Example 2:
太久没刷过题的后果就是之前掌握的一些解题思路好像有点生疏了,但还是勉强完成了这道题,首先从两个Example开始分析,第一个太简单好像看不出什么,我们分析一下第二个,我们可以看到,(2*(3-(4*5))) = -34
是先算第二个*
,然后再算-
,最后算第一个*
。大概可以猜出来我们需要穷举所有运算顺序,但应该不是全排列,因为当运算符个数为3时,他的运算顺序只有5个,而不是6个。仔细分析一下可以发现,这是因为已下两种算法是一样的:
- 先算第一个,再算第三个,最后算第二个
- 先算第三个,再算第一个,最后算第二个
这就有点像一个二叉树了,层数相同的情况。我们尝试把上面五种运行顺序用二叉树表示出来,首先,分别用1
,2
,3
代替*
,-
,*
:
画出来后,我们很容易的发现,这个问题变成了对平衡二叉树的穷举问题,因此代码如下:
由于stringstream
的效率的确不行,所以我们可以尝试将解析字符串的那段代码改成: