给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
示例 1:
输入: “2-1-1”
输出: [0, 2]
解释:
((2-1)-1) = 0
(2-(1-1)) = 2
示例 2:
输入: “23-45”
输出: [-34, -14, -10, -10, 10]
解释:
(2*(3-(45))) = -34
((23)-(45)) = -14
((2(3-4))5) = -10
(2((3-4)5)) = -10
(((23)-4)*5) = 10
class Solution {
public:
vector<int> diffWaysToCompute(string expression) {
return diffWays(expression,0,expression.length()-1);
}
vector<int> diffWays(const string &expression,int left,int right)
{
vector<int> ans;
if(left==right) //当只有一个数字时递归结束
{
ans.push_back(expression[left]-'0');
return ans;
}
if(right==left+1) //当字符串中的数字大于9时
{
ans.push_back((expression[left]-'0')*10+(expression[right]-'0'));
return ans;
}
for(int i=left;i<right;i++)
{
if((expression[i]<'0'||expression[i]>'9')) //非字符时
{
//通过这个字符分割,分为左右两边分别递归
vector<int> res1=diffWays(expression,left,i-1); //存放左边返回的值
vector<int> res2=diffWays(expression,i+1,right); //存放右边的返回值
//计算结果
for(int j=0;j<res1.size();j++)
{
for(int k=0;k<res2.size();k++)
{
switch(expression[i])
{
case '+':
ans.push_back(res1[j]+res2[k]);
break;
case '-':
ans.push_back(res1[j]-res2[k]);
break;
case '*':
ans.push_back(res1[j]*res2[k]);
break;
default:
break;
}
}
}
}
}
return ans;
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/different-ways-to-add-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。