貌似是个新题,题目如下:
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: "2-1-1"
.
((2-1)-1) = 0 (2-(1-1)) = 2
Output: [0, 2]
Input: "2*3-4*5"
(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
Output: [-34, -14, -10, -10, 10]
题目意思是给定字符串表达式,添加括号,求出所有不同的添加方式的结果,升序排列。
思路如下:
考虑1+2+3+4+5,可以先计算一个运算符,得子表达式3+3+4+5利用递归,返回则表达式的返回结果是1+2+3+4+5的一部分,注意一个问题,对于表达式1+2+3+4+5,先计算1+2再计算3+4,和先计算3+4在计算1+2,表现在添加括号上是相同的(1+2)+(3+4)+5;所以递归时只计算上次计算的结果前面的第一个运算符之后的字符。
代码如下:
class Solution {
public:
vector<int> dWtC(vector<int> num,vector<char> ch,int x)
{
vector<int> v;
if (ch.size() == 0)
{
v.push_back(num[0]);
return v;
}
if (ch.size() == 1)
{
int a;
switch (ch[0])
{
case '+':a = num[0] + num[1]; break;
case '-':a = num[0] - num[1]; break;
case '*':a = num[0] * num[1]; break;
default:break;
}
v.push_back(a);
return v;
}
else
{
for (int i = x; i < ch.size(); i++)
{
vector<int> nn = num;
vector<char> cc = ch;
switch (cc[i])
{
case '+':nn[i+1] = num[i] + num[i+1]; break;
case '-':nn[i + 1] = num[i] - num[i + 1]; break;
case '*':nn[i + 1] = num[i] * num[i + 1]; break;
default:break;
}
vector<int>::iterator it_num = nn.begin()+i ;
vector<char>::iterator it_ch = cc.begin() + i;
nn.erase(it_num);
cc.erase(it_ch);
vector<int> vv;
if (i==0)
vv = dWtC(nn,cc,0);
else
vv = dWtC(nn, cc, i-1);
for (int j = 0; j < vv.size(); j++)
v.push_back(vv[j]);
}
sort(v.begin(),v.end());
return v;
}
}
vector<int> diffWaysToCompute(string input)
{
vector<int> v;
if (input.length() == 0)
return v;
vector<int> num;
vector<char> ch;
int a=0;
for (int i = 0; i < input.length(); i++)
{
if (input[i] == '+' || input[i] == '-' || input[i] == '*')
{
num.push_back(a);
ch.push_back(input[i]);
a = 0;
}
else
a =10*a+(input[i]-'0');
}
num.push_back(a);
return dWtC(num, ch,0);
}
};