题目链接:
题目:
Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are+
, -
and *
.
Example 1
Input: "2-1-1"
.
((2-1)-1) = 0 (2-(1-1)) = 2
Output: [0, 2]
Example 2
Input: "2*3-4*5"
(2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -14 ((2*(3-4))*5) = -10 (2*((3-4)*5)) = -10 (((2*3)-4)*5) = 10
Output: [-34, -14, -10, -10, 10]
思路:
从左到右开始遍历,遇到运算符 则将该运算符视为表达式的中心(left op right),表达式分成左右两部分,分别递归计算左右部分,并将结果和该运算符进行相应计算,本次计算相当于在该运算符两边加了个括号(left op right)。 将表达式中每个运算符都做一次如上操作,则得到所有可能情况下的结果值。为了优化时间,可以用一个hashmap保存已经计算过的情况。
算法:
Map<String, List<Integer>> maps = new HashMap<String, List<Integer>>(); public List<Integer> diffWaysToCompute(String input) { List<Integer> results = new ArrayList<Integer>(); for (int i = 0; i < input.length(); i++) { char t = input.charAt(i); if (t == '+' || t == '-' || t == '*') { String sleft = input.substring(0, i); String sright = input.substring(i + 1); List<Integer> left, right; if (maps.containsKey(sleft)) { left = maps.get(sleft); } else { left = diffWaysToCompute(input.substring(0, i));// 左右边所有可能的计算结果 } if (maps.containsKey(sright)) { right = maps.get(sright); } else { right = diffWaysToCompute(input.substring(i + 1)); } for (int l : left) { for (int r : right) { int res = 0; switch (t) { case '+': res = l + r; break; case '-': res = l - r; break; case '*': res = l * r; break; } results.add(res); } } } } if (results.size() == 0) { // 当input为数字时 results.add(Integer.parseInt(input)); } return results; }
时间: 2024-10-06 10:50:32