leetcode 241. 为运算表达式设计优先级
题目:241. 为运算表达式设计优先级
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
示例1:
输入: “2-1-1”
输出: [0, 2]
解释: 
- ((2-1)-1) = 0 
- (2-(1-1)) = 2
示例2:
输入: “23-45”
输出: [-34, -14, -10, -10, 10]
解释: 
- (2*(3-(4*5))) = -34 
- ((23)-(45)) = -14
- ((2*(3-4))*5) = -10 
- (2*((3-4)*5)) = -10 
- (((2*3)-4)*5) = 10
方法:分治
思路:通过分治的思想,将字符串以运算符为标识把字符串分为两个部分,然后分别计算这两个部分的值,可以继续细分的继续按运算符细分求结果,两部分中每个部分都有可能会有不同的结果(可以继续细分就会有不同的结果),所以求结果时,要将两部分不同结果组合起来,才能得出最终的结果。
运行数据:执行用时:2 ms,内存消耗:40.1 MB
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 
 | public List<Integer> diffWaysToCompute(String input) {
 
 
 List<Integer> result = new ArrayList<Integer>();
 
 
 for (int i = 0; i < input.length(); i++) {
 char cha = input.charAt(i);
 if (cha == '+' || cha == '-' || cha == '*') {
 
 
 List<Integer> leftList = diffWaysToCompute(input.substring(0, i));
 List<Integer> rightList = diffWaysToCompute(input.substring(i + 1));
 
 
 for (Integer l : leftList) {
 for (Integer r : rightList) {
 switch (cha) {
 case '+':
 result.add(l + r);
 break;
 case '-':
 result.add(l - r);
 break;
 case '*':
 result.add(l * r);
 break;
 }
 }
 }
 }
 }
 
 
 if (result.size() == 0){
 result.add(Integer.valueOf(input));
 }
 
 return result;
 }
 
 | 
学习所得,资料、图片部分来源于网络,如有侵权,请联系本人删除。
才疏学浅,若有错误或不当之处,可批评指正,还请见谅!