Problem:
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]
Analysis:
Solutions:
C++:
int SToI(const string& str)
{
bool is_neg = false;
if(str[0] == '-')
is_neg = true;
int start = is_neg;
int value = 0;
for(; start < str.size(); ++start) {
value *= 10;
value += str[start] - '0';
}
return (is_neg ? -1 : 1) * value;
}
vector<int> diffWaysToCompute(string input) {
vector<int> results;
if(input.size() == 0)
return results;
for(int i = 0; i < input.size(); ++i) {
if(input[i] == '+' || input[i] == '-' || input[i] == '*') {
vector<int> left_results;
left_results = diffWaysToCompute(input.substr(0, i));
vector<int> right_results;
right_results = diffWaysToCompute(input.substr(i + 1));
for(int left = 0; left < left_results.size(); ++left) {
for(int right = 0; right < right_results.size(); ++right) {
if(input[i] == '+')
results.push_back(left_results[left] + right_results[right]);
else if(input[i] == '-')
results.push_back(left_results[left] - right_results[right]);
else
results.push_back(left_results[left] * right_results[right]);
}
}
}
}
if(results.empty())
results.push_back(SToI(input));
return results;
}
Java:
Python: