回溯搜索。该问题牵涉到括号的组合问题,一般使用递归+回溯的思想。主要想法:
- 递归回溯。可以产生所有的组合方式。
- 每个小组合方式相当于一个子集,不断的将计算结果返回给上一层。
举例:a + (b - (c d))会不断的变成a + (b - (res1 res2))-> a + (res1 - res2) -> res1
- res2
计算结果需要for循环!!!其实有这种情况,a + (b - (c d))和a + (b - c) d)),这里 a +
res2,res2就可能有多种情况。
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
30class Solution {
public List<Integer> diffWaysToCompute(String input) {
List<Integer> ways = new ArrayList<>();
for(int i=0; i<input.length(); i++){
char c = input.charAt(i);
if(c=='+' || c=='-' || c=='*'){
List<Integer> left = diffWaysToCompute(input.substring(0, i));
List<Integer> right = diffWaysToCompute(input.substring(i+1));
for(Integer l : left){
for(Integer r : right){
switch(c){
case '+':
ways.add(l+r);
break;
case '-':
ways.add(l-r);
break;
case '*':
ways.add(l*r);
break;
}
}
}
}
}
if(ways.size()==0)
ways.add(Integer.valueOf(input));
return ways;
}
}