您的位置:首页 > 其它

每天一道LeetCode-----对表达式添加括号并求值,返回所有可能的计算结果

2017-12-23 10:40 274 查看

Different Ways to Add Parentheses

原题链接Different Ways to Add Parentheses



给出一个只有加,减,乘运算的表达式,要求在这个表达式中添加合理的括号,返回所有填上括号后的计算结果

考虑每一个操作符(+, -, *),每一个操作符实际上是将表达式分成了左右两部分。

以2−1−1为例,第一个”-“将表达式分成了两部分,分别是2和1−1,那么就可以假定添加括号的结果是(2)−(1−1)

同样的对左右两边进行处理

(2)不能再拆分,直接返回

(1−1)中仍然有一个操作符,又分成左右两部分,分别是1和1,那么就可以嘉定添加括号的结果是(1)−(1)

继续对左右两边进行处理,都不能继续拆分,直接返回

可以发现,到最后面,整个表达式都被拆分成一个个数,然后逐层向上返回,根据操作符的不同进行将左右两边返回的结果进行不同的运算,继续向上返回

代码如下

class Solution {
public:
vector<int> diffWaysToCompute(string input) {
vector<int> res;
for(int i = 0; i < input.size(); ++i)
{
//如果是操作符,就将左右两边分开
if(isOperator(input[i]))
{
//返回左边和右边的所有可能结果
vector<int> lhs = diffWaysToCompute(input.substr(0, i));
vector<int> rhs = diffWaysToCompute(input.substr(i + 1));
//依次组合,因为返回之前考虑了为空的情况,所以这里无需判断是否为空
for(auto n1 : lhs)
{
for(auto n2 : rhs)
{
if(input[i] == '+') res.emplace_back(n1 + n2);
else if(input[i] == '-')    res.emplace_back(n1 - n2);
else    res.emplace_back(n1 * n2);
}
}
}
}
if(res.empty())
{
//可以添加一条语句判断input是空字符的情况
//if(input.empty()) input.append(1, '0');
int n = 0;
sscanf(input.c_str(), "%d", &n);
res.emplace_back(n);
}
return res;
}
private:
bool isOperator(char op)
{
return op == '+' || op == '-' || op == '*';
}
};


本题主要还是递归,将大问题转换为左右两个小问题,进而求解

以前还遇到过只需要将所有加括号的情况返回的,忘记在哪了:cry:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode
相关文章推荐