1 题目
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"
Output: [0, 2]
Explanation:
((2-1)-1) = 0
(2-(1-1)) = 2
Example 2:
Input: "2*3-4*5"
Output: [-34, -14, -10, -10, 10]
Explanation:
(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
2 尝试解
class Solution {
public:
vector<int> diffWaysToCompute(string s) {
//usecase 2*3-4*5
//for first '*', it left can be [2], its right can be[-5,-17],so the result of '*' is [-10,-34]
//for '-',it left can be [6],its right can be[20],so the reuslt of '-' is [-14]
map<pair<int,int>,vector<int>> saver;
vector<string> expression;
for(int i = 0; i < s.size(); i++){
string temp = "";
while(s[i] >= '0' && s[i] <= '9'){
temp += s[i];
i++;
}
if(temp.size()!=0) {expression.push_back(temp);temp.clear();}
if(i < s.size()){
temp += s[i];
expression.push_back(temp);
}
}
pair<int,int> interval(0,expression.size()-1);
return Calculate(expression,saver,interval);
}
vector<int> Calculate(vector<string>&expression,map<pair<int,int>,vector<int>>&saver,pair<int,int> interval){
if (saver.count(interval) != 0) return saver[interval];
vector<int> result;
if(interval.second-interval.first == 0) {
result.push_back(atoi(expression[interval.first].c_str()));
}
else{
for(int i = interval.first+1; i < interval.second; i+=2){
vector<int> left = Calculate(expression,saver,pair<int,int>(interval.first,i-1));
vector<int> right = Calculate(expression,saver,pair<int,int>(i+1,interval.second));
for(auto left_num : left){
for(auto right_num:right){
switch(expression[i][0]){
case '+': result.push_back(left_num+right_num); break;
case '-': result.push_back(left_num-right_num); break;
case '*': result.push_back(left_num*right_num); break;
case '/': result.push_back(left_num/right_num); break;
}
}
}
}
saver[interval] = result;
}
return result;
}
};
3 标准解
vector<int> diffWaysToCompute(string input) {
vector<int> output;
for (int i=0; i<input.size(); i++) {
char c = input[i];
if (ispunct(c))
for (int a : diffWaysToCompute(input.substr(0, i)))
for (int b : diffWaysToCompute(input.substr(i+1)))
output.push_back(c=='+' ? a+b : c=='-' ? a-b : a*b);
}
return output.size() ? output : vector<int>{stoi(input)};
}