241. Different Ways to Add Parentheses
一、题目
1、审题
2、分析
给出一个运算式的字符串,求加上括号后的所有可能结果。
二、解答
1、思路
采用递归方式。
碰到操作符后就将运算式分为前后两部分,递归调用此方法算出前后两部分的所有运算结果。在根据此操作符将前后两部分的结果进行操作。最终将结果存于 List中进行返回。
可以通过一个 Map 存储 输入字符串对应的运算结果,减少递归的次数。
1 HashMap<String, List<Integer>> map = new HashMap<>(); 2 public List<Integer> diffWaysToCompute(String input) { 3 if(map.containsKey(input)) 4 return map.get(input); 5 6 List<Integer> ret = new LinkedList<Integer>(); 7 for (int i = 0; i < input.length(); i++) { 8 char ch = input.charAt(i); 9 if(ch == '-' || ch == '+' || ch == '*') { 10 String part1 = input.substring(0, i); 11 String part2 = input.substring(i + 1); 12 List<Integer> part1Ret = diffWaysToCompute(part1); 13 List<Integer> part2Ret = diffWaysToCompute(part2); 14 15 for(Integer p1: part1Ret) { 16 for(Integer p2: part2Ret) { 17 int c = 0; 18 switch (ch) { 19 case '+': c = p1 + p2; 20 break; 21 case '-': c = p1 - p2; 22 break; 23 case '*': c = p1 * p2; 24 break; 25 } 26 ret.add(c); 27 } 28 } 29 } 30 } 31 if(ret.size() == 0) 32 ret.add(Integer.valueOf(input)); 33 map.put(input, ret); 34 return ret; 35 }