【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
Example 1
Input:
Output:
Example 2
Input:
Output:
思路:
从左到右开始遍历,遇到运算符 则将该运算符视为表达式的中心(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;
}
题目:
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;
}
相关文章推荐
- 剑指Offer——翻转单词顺序VS左旋转字符串
- 剑指Offer之打印1到最大的n位数(题12)
- 剑指Offer之数值的整数次方(题11)
- 剑指Offer之二进制中1的个数(题10)
- "_OBJC_CLASS_$_xxx", reference from:报错
- 剑指Offer之从斐波那契数列(题9)
- 一些元素居中的方法css的设置
- win7 64位+caffe+cuda7.5配置
- 剑指Offer之旋转数组中的最小数字(题8)
- 剑指Offer之用两个栈实现队列(题7)
- web工程中js文件有报错怎么办?
- 剑指Offer之重建二叉树(题6)
- 剑指Offer之从尾到头打印链表(题5)
- 如何让两个元素的相对位置不变,设置css
- Web前端学习第十一天·fighting_使用CSS布局和定位(一)
- 剑指Offer之替换空格(题4)
- Javascript Lazyload图片延迟加载特效,降低HTPP连接次数,提高页面访问时间
- js近期心得体会
- 字符流FileWriter,FileReader、缓冲区,BufferReader,BufferWriter,IO的简单异常处理
- 剑指Offer之赋值运算符重载(题1)