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)
{
int len = input.size();
vector<int> res,left,right;
for(int i = 0 ; i < len ; i++)
{
char c = input[i];
if(c == '+' || c == '-' || c == '*')
{
left = diffWaysToCompute(input.substr(0 , i)); //运算符左侧可能取值的集合
right = diffWaysToCompute(input.substr(i+1)); //右侧
for(int j = 0 ; j < left.size() ; j++)
{
for(int k = 0 ; k < right.size() ; k++) //计算所有可能的值(单个运算符),并加入返回向量
{
switch(c)
{
case '+':
res.push_back(left[j] + right[k]);
break;
case '-':
res.push_back(left[j] - right[k]);
break;
case '*':
res.push_back(left[j] * right[k]);
break;
}
}
}
}
}
if(res.empty())
res.push_back(stoi(input));
return res;
}
};