题目: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]
思路: 这道题目让我们用不同的方式添加括号,改变算式的运算次序,从而得到不同的结果。可以采用分而治之的思想去实现,遍历字符串,当遇到操作符的时候,用该操作符将字符串划分为左右两部分,然后再分别递归的将左右两部分进行划分,直到所遍历的字符串没有操作符,将其转化为数字并返回上一级,最后合并左右两部分,因为操作符左右两部分也可能有多个不同的结果,所以利用一个两层循环,将操作符左右两部分所得到的结果两两组合,便得到最终的结果。 代码如下:
class Solution {
public:
vector<int> diffWaysToCompute(string input) {
vector<int> res;
for (int i = 0; i < input.size(); ++i) {
if (input[i] == '+' || input[i] == '-' || input[i] == '*') {
vector<int> left = diffWaysToCompute(input.substr(0, i));
vector<int> right = diffWaysToCompute(input.substr(i + 1));
for (int j = 0; j < left.size(); ++j) {
for (int k = 0; k < right.size(); ++k) {
if (input[i] == '+') res.push_back(left[j] + right[k]);
else if (input[i] == '-') res.push_back(left[j] - right[k]);
else res.push_back(left[j] * right[k]);
}
}
}
}
if (res.empty()) res.push_back(atoi(input.c_str()));
return res;
}
};