[leetcode]Different Ways to Add Parentheses
2015-08-20 09:42
417 查看
from:https://leetcode.com/submissions/detail/36926833/
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:
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]
public class Solution { Map<String, List<Integer>> subs; public List<Integer> diffWaysToCompute(String input) { if(null == input || "".equals(input)) return new ArrayList<Integer>(); List<Integer> nums = new ArrayList<Integer>(); List<Character> opts = new ArrayList<Character>(); subs = new HashMap<String, List<Integer>>(); // +:<0 -:=0 *>0 findOutNumsOpts(input, nums, opts); return calculate(nums, opts); } private List<Integer> calculate(List<Integer> nums, List<Character> opts) { return calculate(nums, opts, 0, nums.size()-1); } private List<Integer> calculate(List<Integer> nums, List<Character> opts, int st, int ed) { List<Integer> anses = new ArrayList<Integer>(); if(st == ed) { anses.add(nums.get(st)); return anses; } for(int i=st; i<ed; ++i) { List<Integer> lefts = subs.get(st + "-" +i); if(null == lefts) { lefts = calculate(nums, opts, st, i); subs.put(st + "-" +i, lefts); } List<Integer> rigts = subs.get((i+1) + "-" + ed); if(null == rigts) { rigts = calculate(nums, opts, i+1, ed); subs.put((i+1) + "-" + ed, rigts); } for(Integer lv : lefts) { for(Integer rv : rigts) { switch(opts.get(i)) { case '+' : { anses.add(lv+rv); break; } case '-' : { anses.add(lv-rv); break; } case '*' : { anses.add(lv*rv); break; } } } } } return anses; } private void findOutNumsOpts(String s, List<Integer> nums, List<Character> opts) { for(int i=0, n=s.length(); i<n; ++i) { char c = s.charAt(i); if('+' == c) { opts.add('+'); } else if('-' == c){ opts.add('-'); } else if('*' == c) { opts.add('*'); } else if('0'<=c && '9'>=c) { int u = 0; while(i<n && '0'<=c && '9'>=c) { u = u*10 + c-'0'; ++i; if(i < n) c = s.charAt(i); } nums.add(u); --i; } } } }
public class Solution { public List<Integer> diffWaysToCompute(String input) { if(null == input || "".equals(input)) return new ArrayList<Integer>(); List<Integer> nums = new ArrayList<Integer>(); List<Character> opts = new ArrayList<Character>(); // +:<0 -:=0 *>0 findOutNumsOpts(input, nums, opts); return calculate(nums, opts); } private List<Integer> calculate(List<Integer> nums, List<Character> opts) { return calculate(nums, opts, 0, nums.size()-1); } private List<Integer> calculate(List<Integer> nums, List<Character> opts, int st, int ed) { List<Integer> anses = new ArrayList<Integer>(); if(st == ed) { anses.add(nums.get(st)); return anses; } for(int i=st; i<ed; ++i) { List<Integer> lefts = calculate(nums, opts, st, i); List<Integer> rigts = calculate(nums, opts, i+1, ed); for(Integer lv : lefts) { for(Integer rv : rigts) { switch(opts.get(i)) { case '+' : { anses.add(lv+rv); break; } case '-' : { anses.add(lv-rv); break; } case '*' : { anses.add(lv*rv); break; } } } } } return anses; } private void findOutNumsOpts(String s, List<Integer> nums, List<Character> opts) { for(int i=0, n=s.length(); i<n; ++i) { char c = s.charAt(i); if('+' == c) { opts.add('+'); } else if('-' == c){ opts.add('-'); } else if('*' == c) { opts.add('*'); } else if('0'<=c && '9'>=c) { int u = 0; while(i<n && '0'<=c && '9'>=c) { u = u*10 + c-'0'; ++i; if(i < n) c = s.charAt(i); } nums.add(u); --i; } } } }
相关文章推荐
- jQuery的deferred对象详解
- js代码实现无缝滚动(文字和图片)
- jQuery 属性操作 - attr() 方法
- html利用锚点实现定位代码实例
- jquery响应回车事件
- js图片翻书效果代码分享
- JS给Textarea文本框添加行号的方法
- 后台模版第二季,真正好用漂亮,HTML5+CSS3搭建,下载即用,无需二次编写。
- HTML5----video ,audio常规操作
- json与jsonp的区别
- jQuery 1.8版本后不支持toggle()事件,只支持显示隐藏-------解决方案
- js Unicode编码相互转换
- js实现Select列表内容自动滚动效果代码
- caffe 中的损失函数分析
- js Unicode编码相互转换
- 基于CSS+dIV的网页层,点击后隐藏或显示
- 清除页面广告?身为前端,自己做一款简易的chrome扩展插件吧
- JavaScript中几种=的用法比较
- 原创:CSS3技术-雪碧图自适应缩放与精灵动画方案
- Post返回json值