每天一道LeetCode-----对表达式添加括号并求值,返回所有可能的计算结果
生活随笔
收集整理的這篇文章主要介紹了
每天一道LeetCode-----对表达式添加括号并求值,返回所有可能的计算结果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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-----生成由
- 下一篇: 每天一道LeetCode-----二叉搜