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]
#include <string>
#include <vector>
#include <iostream>
using namespace std;
// this coding practise teaches me that I am not good at divide and conquer method....
vector<int> diffWaysToCompute(string str) {
if(str.size() == 0) return {};
vector<int> result;
for(int i = 0; i < str.size(); ++i) {
if(str[i] != '+' && str[i] != '*' && str[i]!= '-') continue;
auto front = diffWaysToCompute(str.substr(0, i));
auto end = diffWaysToCompute(str.substr(i+1));
for(auto val1 : front) {
for(auto val2 : end) {
if(str[i] == '+') result.push_back(val1 + val2);
else if(str[i] == '*') result.push_back(val1 * val2);
else if(str[i] == '-') result.push_back(val1 - val2);
}
}
}
return result.empty() ? vector<int>{stoi(str)} : result;
}
int main(void) {
vector<int> res = diffWaysToCompute("1+6*3");
for(int i = 0; i < res.size(); ++i) cout << res[i] << endl;
}