每天一道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-----将字符串切分,使每个子串都是回文串,计算所有可能结果和最小切分次数
- 每天一道LeetCode-----计算整型数二进制中1的个数/返回二进制翻转后的结果
- 每天一道LeetCode-----计算给定范围内所有数的与运算结果
- [leetcode 241] Different Ways to Add Parentheses--------计算运算公式字符串中所有可能结果
- 每天一道LeetCode-----计算给定序列中所有长度为k的滑动窗的最大值集合
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 每天一道LeetCode-----计算从二维数组的左上角到达右下角的所有路径数及最短的那条,如果存在障碍物时又是多少
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- CASE 计算条件列表并返回多个可能结果表达式之一
- 每天一道LeetCode-----将字符串切分成若干单词,使得每个单词都在给定的字典中,求出所有的切分结果
- 每天一道LeetCode-----计算二叉树所有根节点到叶子节点的和
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 每天一道LeetCode-----二叉树逐层遍历,每一层存在一个序列中,返回所有序列集合
- 每天一道LeetCode-----只可能有'.'和'*'的字符串正则匹配
- 每天一道LeetCode-----平面上n个点,计算最多有多少个点在一条直线上
- leetcode 224. Basic Calculator 字符串表达式计算 + 仅仅涉及到加法减法括号运算
- leetcode 282. Expression Add Operators 任意添加运算符计算结果 +深度优先遍历DFS
- 每天一道LeetCode-----找出给定序列的所有子序列
- 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素
- java中正则表达式用Pattern计算字符串的结果(四则运算);分成有括号和没括号;当然也可以采用逆波兰式