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


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]

Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.

 

先想到是就是递归了,下面是AC代码。可能有更好的解法,想到了再回来补充。

 1 class Solution {
 2 public:
 3     int compute(int a, int b, char op) {
 4         switch (op) {
 5             case '+': return a + b;
 6             case '-': return a - b;
 7             case '*': return a * b;
 8         }
 9         return 1;
10     }
11     vector<int> diffWaysToCompute(string input) {
12         int val = 0, idx = 0;
13         while (idx < input.length() && isdigit(input[idx])) {
14             val *= 10;
15             val += input[idx++] - '0';
16         }
17         if (idx == input.length()) return {val};
18         vector<int> res;
19         vector<int> left, right;
20         for (int i = 0; i < input.length(); ++i) {
21             if (!isdigit(input[i])) {
22                 left = diffWaysToCompute(input.substr(0, i));
23                 right = diffWaysToCompute(input.substr(i + 1, input.length() -1 - i));
24                 for (int j = 0; j < left.size(); ++j) {
25                     for (int k = 0; k < right.size(); ++k) {
26                         res.push_back(compute(left[j], right[k], input[i]));
27                     }
28                 }
29             }
30         }
31         return res;
32     }
33 };

 

posted @ 2015-07-27 22:50  Eason Liu  阅读(4018)  评论(0编辑  收藏  举报