【分治思想】241. 为运算表达式设计优先级
用运算符作为分割,对两边的表达式进行求值,分而治之;
class Solution {
public:
int calc(int left, int right, char op){
switch (op){
case '+':
return left + right;
case '-':
return left - right;
case '*':
return left * right;
}
return 0;
}
vector<int> diffWaysToCompute(string expression) {
int expr_len = expression.size();
vector<int> result;
bool flag = false;
for(int i=0;i<expr_len;++i)
if (expression[i] < '0' || expression[i] > '9'){
flag = true;
auto left = diffWaysToCompute(expression.substr(0, i));
auto right = diffWaysToCompute(expression.substr(i+1, expr_len-i-1));
for(auto l : left)
for(auto r: right)
result.push_back(calc(l,r,expression[i]));
}
if(!flag)
result.push_back(atoi(expression.c_str()));
return result;
}
private:
};
带记录进行优化,剪枝:(其实就是加个map)
class Solution {
public:
int calc(int left, int right, char op){
switch (op){
case '+':
return left + right;
case '-':
return left - right;
case '*':
return left * right;
}
return 0;
}
vector<int> diffWaysToCompute(string expression) {
if(record.find(expression) != record.end()){
return record[expression];
}
int expr_len = expression.size();
vector<int> result;
bool flag = false;
for(int i=0;i<expr_len;++i)
if (expression[i] < '0' || expression[i] > '9'){
flag = true;
string left_str = expression.substr(0, i);
string right_str = expression.substr(i+1, expr_len-i-1);
auto left = diffWaysToCompute(left_str);
record[left_str] = left;
auto right = diffWaysToCompute(right_str);
record[right_str] = right;
for(auto l : left)
for(auto r: right)
result.push_back(calc(l,r,expression[i]));
}
if(!flag)
result.push_back(atoi(expression.c_str()));
return result;
}
private:
map<string, vector<int>> record;
};

浙公网安备 33010602011771号