LeetCode: 241. Different Ways to Add Parentheses
题目描述
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 *
.
Example 1:
Input: "2-1-1"
Output: [0, 2]
Explanation:
((2-1)-1) = 0
(2-(1-1)) = 2
Example 2:
Input: "2*3-4*5"
Output: [-34, -14, -10, -10, 10]
Explanation:
(2*(3-(4*5))) = -34
((2*3)-(4*5)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10
解题思路 —— 暴力搜索
这是一道排列组合问题,每个运算符号都可以将表达式分为两半,分别计算每一半,然后再计算运算符。
AC 代码
class Solution {
private:
int cal(char op, int lhv, int rhv)
{
if(op == '+')
{
return lhv+rhv;
}
else if(op == '-')
{
return lhv-rhv;
}
else
{
return lhv*rhv;
}
}
// [beg, end)
vector<int> diffWaysToCompute(const vector<int>& nums, const string& opers, int beg, int end)
{
if(beg >= end) return {};
else if(beg + 1 == end) return {nums[beg]};
vector<int> res;
for(size_t i = beg+1; i < end; ++i)
{
vector<int> leftRes = diffWaysToCompute(nums, opers, beg, i);
vector<int> rightRes = diffWaysToCompute(nums, opers, i, end);
for(int li = 0; li < leftRes.size(); ++li)
{
for(int ri = 0; ri < rightRes.size(); ++ri)
{
res.push_back(cal(opers[i-1], leftRes[li], rightRes[ri]));
}
}
}
return res;
}
public:
vector<int> diffWaysToCompute(string input) {
vector<int> nums;
string opers;
int curNum = 0;
for(size_t i = 0; i < input.size(); ++i)
{
if(input[i] >= '0' && input[i] <= '9')
{
curNum = curNum*10+input[i]-'0';
}
else
{
nums.push_back(curNum);
curNum = 0;
opers.push_back(input[i]);
}
if(i == input.size()-1)
{
nums.push_back(curNum);
curNum = 0;
}
}
return diffWaysToCompute(nums, opers, 0, nums.size());
}
};