每天一道LeetCode-----對錶達式新增括號並求值,返回所有可能的計算結果
阿新 • • 發佈:2019-01-29
Different Ways to Add Parentheses
給出一個只有加,減,乘運算的表示式,要求在這個表示式中新增合理的括號,返回所有填上括號後的計算結果
考慮每一個操作符(+, -, *),每一個操作符實際上是將表示式分成了左右兩部分。
以
同樣的對左右兩邊進行處理
繼續對左右兩邊進行處理,都不能繼續拆分,直接返回
可以發現,到最後面,整個表示式都被拆分成一個個數,然後逐層向上返回,根據操作符的不同進行將左右兩邊返回的結果進行不同的運算,繼續向上返回
程式碼如下
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: