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 andoperators. The valid operators are +, - and *.
Divide and Conquer
Time Complexity
O(Catalan数)
就是有多少种形态的树,时间复杂度就是多少
可以参考n个节点的二叉树有多少种形态(Catalan数)
思路
可以把这些方程想象是不同的二叉树,优先级越高的就在树的越底层,对于方程式,从左到右遍历一遍,一遇到运算符就提取出来作为根节点,数字一定是叶子节点。把树后序遍历一遍,先得到左右的值,再通过根节点的运算符计算一下。base case就是方程式中只剩下数字,没有运算符的时候,就可以开始返回了,这里用了一个boolean来标记这个string是不是数字。返回上来的左右list里的值,用了两个for loop把所以数字组合的可能性计算出来。
代码
public List<Integer> diffWaysToCompute(String input) {
List<Integer> res = new ArrayList<Integer>();
boolean isNumber = true;
//here we can remove base case, because we use for loop as the
//base case, when input.length() == 0 means we reach the end
for(int i = 0; i < input.length(); i++){
char c = input.charAt(i);
if(c == '+' || c == '-' || c == '*'){
isNumber = false;
List<Integer> left = diffWaysToCompute(input.substring(0, i));
List<Integer> right = diffWaysToCompute(input.substring(i + 1,input.length()));
for (int x : left) {
for (int y : right) {
if (c == '-') {
res.add(x - y);
} else if (c == '+') {
res.add(x + y);
} else if (c == '*') {
res.add(x * y);
}
}
}
}
}
if(isNumber) res.add(Integer.valueOf(input));
return res;
}
优化
这题可能涉及大量的重复运算,所以可以把计算过的结果存储起来, 还没学会DP的存储,学会之后更新
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。