241. Different Ways to Add Parentheses
- Total Accepted: 39401
- Total Submissions: 93671
- Difficulty: Medium
- Contributors: Admin
Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are +
, -
and *
.
解題思路:首先遍歷input字符串,每遇到一個運算符,就分別計算該運算符之前和之後兩部分的可能值res_right和res_left,然後兩層循環這兩個vector,將運算結果放入res中。最後要記得討論若res爲空的情況,即input中只有一個數字,這時直接將該數字加入res(ret.push_back(atoi(input.c_str()));)該方法也是string類轉化爲int/long類的一種常用方法。
class Solution {
public:
vector<int> diffWaysToCompute(string input) {
vector<int> ret;
for(int i = 0; i < input.size(); i ++)
{
if(input[i] == '+' || input[i] == '-' || input[i] == '*')
{
vector<int> left = diffWaysToCompute(input.substr(0, i));
vector<int> right = diffWaysToCompute(input.substr(i+1));
for(int j = 0; j < left.size(); j ++)
{
for(int k = 0; k < right.size(); k ++)
{
if(input[i] == '+')
ret.push_back(left[j] + right[k]);
else if(input[i] == '-')
ret.push_back(left[j] - right[k]);
else
ret.push_back(left[j] * right[k]);
}
}
}
}
if(ret.empty())
ret.push_back(atoi(input.c_str()));
return ret;
}
};
總結:通過計算可知該方法的複雜度爲O(n*3),主要難點就是運用到遞歸使得代碼簡潔(直接算出左右兩部分的子vector),,還有要注意的地方就是遞歸的遞歸的最後情況,只有一個數字了,要最後討論,這是特變要注意的一點。