F_G

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

[Leetcode] Different Ways to Add Parentheses

Different Ways to Add Parentheses

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]

这个题目刚开始拿到的时首先想到的是这样的思路:产生所有的括号组合方式,也就是产生所有的expression,然后调用计算表达式的方法求取结果。

后来发现,题目的提示使用分治算法,OMG!!

一、首先将input字符串分解为两部分

data和operator

比如2*3-4*5

data:      2 | 3 | 4 | 5

operator:* | - | *

我们可以不断的选择中点mid将data划分为两部分,这里mid=[0,1,2]

分别表示划分的left部分的最后一个数字,对应的right部分的开始是从[1,2,3]

实际上思路已经很明了,直接贴一下代码

 1 import java.util.*;
 2 
 3 public class Solution {
 4     private List<Integer> divide(Vector<Character> op, Vector<Integer> data, int dstart,int dend){
 5         if(dstart==dend){
 6             List<Integer> res = new LinkedList<Integer>();
 7             res.add(data.get(dstart));
 8             return res;
 9         }
10         List<Integer> res = new LinkedList<Integer>();
11         for(int mid = dstart;mid<dend;mid++){
12             List<Integer> left = divide(op,data,dstart,mid);
13             List<Integer> right = divide(op,data,mid+1,dend);
14             char opc = op.get(mid);
15             for(int i=0;i<left.size();i++){
16                 for(int j=0;j<right.size();j++){
17                     int tmp = 0;
18                     switch(opc){
19                         case '+':
20                             tmp = left.get(i)+right.get(j);
21                         break;
22                         case '-':
23                             tmp = left.get(i)-right.get(j);
24                         break;
25                         case '*':
26                             tmp = left.get(i)*right.get(j);
27                         break;
28                     }
29                     res.add(tmp);
30                 }
31             }
32         }
33         return res;
34     }
35     public List<Integer> diffWaysToCompute(String input) {
36         Vector<Character> op = new Vector<Character>();
37         Vector<Integer> data = new Vector<Integer>();
38         int index = 0;
39         while(index<input.length()){
40             char c = input.charAt(index);
41             if(c=='+'||c=='-'||c=='*'){
42                 op.add(c);
43                 index++;
44             }else{
45                 int endindex = index+1;
46                 while(endindex<input.length()&&Character.isDigit(input.charAt(endindex)))endindex++;
47                 String tmp = input.substring(index,endindex);
48                 data.add(Integer.parseInt(tmp));
49                 index = endindex;
50             }
51         }
52         return divide(op,data,0,data.size()-1);
53     }
54 }

 

posted on 2015-09-01 19:36  F_G  阅读(171)  评论(0编辑  收藏  举报