您的位置:首页 > Web前端

【Leetcode】Different Ways to Add Parentheses

2016-05-26 21:51 483 查看
题目链接:

题目:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: