241. 为运算表达式设计优先级

241. 为运算表达式设计优先级

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

1
2
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
// LeetCode指定调用方法
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;
}
}
}
}
}

// 如果result为空,说明字符串不能分为两个部分,字符串只包含数
if (result.size() == 0){
result.add(Integer.valueOf(input));
}

return result;
}

学习所得,资料、图片部分来源于网络,如有侵权,请联系本人删除。

才疏学浅,若有错误或不当之处,可批评指正,还请见谅!


 
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×