1. 题目
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/different-ways-to-add-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 示例
输入: "2-1-1"
输出: [0, 2]
解释:
((2-1)-1) = 0
(2-(1-1)) = 2
3.题解
一看到题就觉得有点复杂,可以考虑一下递归的方式,去寻找子问题和原问题解的关系。
可以通过运算符把整个式子分成两部分,两部分再利用递归解决。
以 2 * 3 - 4 * 5 为例。
2 和 3 - 4 * 5 两部分,中间是 * 号相连。
2 * 3 和 4 * 5 两部分,中间是 - 号相连。
2 * 3 - 4 和 5 两部分,中间是 * 号相连。
有了两部分的结果,然后再通过中间的符号两两计算加入到最终的结果中即可。
比如第一种情况,2 和 3 - 4 * 5 两部分,中间是 * 号相连。
2 的解就是 [2],3 - 4 * 5 的解就是 [-5, -17]。
把两部分解通过 * 号计算,最终结果就是 [-10, -34]。
另外两种情况也类似。
然后还需要递归出口。
如果给定的字符串只有数字,没有运算符,那结果就是给定的字符串转为数字。
比如上边的第一种情况,2 的解就是 [2]。
4. Code
1 public class DiffWaysToCompute {
2 public List<Integer> diffWaysToCompute(String input) {
3 /**
4 * @Method: diffWaysToCompute
5 * @Author: haifwu
6 * @Version: 1.0
7 * @Date: 27/05/2021 21:45
8 * @param input
9 * @Return: java.util.List<java.lang.Integer>
10 * @Description: 递归
11 *
12 * 题解:
13 * 以字符为分隔
14 * 左边的再次进入递归
15 * 右边进入递归
16 */
17 if(input == null || input.length() == 0) {
18 return new ArrayList<>();
19 }
20 List<Integer> result = new ArrayList<>();
21 int num = 0;
22 // 考虑是全数字
23 int index = 0;
24 while(index < input.length() && !isOperation(input.charAt(index))) {
25 num = num * 10 + input.charAt(index) - '0';
26 index++;
27 }
28 // 将全数字的情况直接返回
29 if(index == input.length()) {
30 result.add(num);
31 return result;
32 }
33 for(int i = 0; i < input.length(); i++) {
34 if(isOperation(input.charAt(i))) {
35 List<Integer> results1 = diffWaysToCompute(input.substring(0, i));
36 List<Integer> results2 = diffWaysToCompute(input.substring(i+1));
37 for(int j = 0; j < results1.size(); j++) {
38 for(int k = 0; k <results2.size(); k++) {
39 char op = input.charAt(i);
40 result.add(cacultter(results1.get(j), op, results2.get(k)));
41 }
42 }
43
44 }
45 }
46 return result;
47 }
48
49 private int cacultter(int num1, char c, int num2) {
50 switch (c) {
51 case '+':
52 return num1 + num2;
53 case '-':
54 return num1 - num2;
55 case '*':
56 return num1 * num2;
57 }
58 return -1;
59 }
60
61 private boolean isOperation(char c) {
62 return c == '+' || c == '-' || c =='*';
63 }
64
65 public static void main(String[] args) {
66 String input = "2-1-1";
67 System.out.println(new DiffWaysToCompute().diffWaysToCompute(input).toString());
68 }
69 }