题目:
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:
bool isOptr(char ch){
if (ch == '+' || ch == '-' || ch == '*') return true;
return false;
}
int oneCalculate(int n1, int n2, char optr){
int res = 0;
switch (optr)
{
case '+':res = n1 + n2; break;
case '-':res = n1 - n2; break;
case '*':res = n1 * n2; break;
default:
break;
}
return res;
}
void calculate(vector<int> nums, vector<char> optr, int start, vector<int> &res){
if (optr.empty()){
res.push_back(nums[0]);
return;
}
for (int i = start; i < nums.size()-1;++i){//注意从start开始
int oneC = oneCalculate(nums[i], nums[i + 1], optr[i]);
//删除一个操作符
vector<char> optrNew(optr);
vector<char>::iterator iterOptr = optrNew.begin();
optrNew.erase(iterOptr+i);
//删除两个操作数并在该位置插入oneC
vector<int> numsNew(nums);
vector<int>::iterator iterNum = numsNew.begin();
numsNew.erase(iterNum + i, iterNum + i + 2);
iterNum = numsNew.begin()+i;
numsNew.insert(iterNum, oneC);
int start = i - 1 >0 ? i - 1 : 0;
calculate(numsNew, optrNew, start, res);
}
}
vector<int> diffWaysToCompute(string input){
int n = input.size();
vector<int> nums;
vector<char> optr;
int i = 0;
while (i < n){
if (isOptr(input[i])){
optr.push_back(input[i]);
++i;
}
else if (isdigit(input[i])){
int tmp = 0;
while (isdigit(input[i])){
tmp = 10 * tmp + (input[i] - '0');
++i;
}
nums.push_back(tmp);
}
else ++i;
}
vector<int> res;
calculate(nums, optr, 0, res);
return res;
}
int main(){
string input;
cin >> input;
vector<int> res = diffWaysToCompute(input);
for (int i = 0; i < res.size()-1; ++i){
cout << res[i] << ' ';
}
if (res.size() > 0) cout << res[res.size() - 1] << endl;
return 0;
}
};