[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 }