您的位置:首页 > Web前端

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