问题描述:
给定一个含有数字和运算符的字符串,用所有不同的可能的方法计算所有可能的结果。 有效的运算符是+, - 和*。
解题思路:
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]
由这个例子可以看出,括号的位置决定了计算的顺序,故而计算结果有多种。直接求解比较困难,所以采用分而治之的方法:遍历所给字符串,每次遇到 + or - or * ,就将原字符串分为两个子串,并对两个子串递归调用这个过程,直到子串的规模减小到我们可以处理的情况,也就是字符串中没有+ or - or * 的情况。
源代码如下:
class Solution {
public:
vector<int> combine(vector<int> vec1,vector<int> vec2,char ch)
{
vector<int> result;
switch (ch)
{
case '+':
{
for(int i=0;i<vec1.size();i++)
{
for(int j=0;j<vec2.size();j++)
result.push_back(vec1[i]+vec2[j]);
}
break;
}
case '-':
{
for(int i=0;i<vec1.size();i++)
{
for(int j=0;j<vec2.size();j++)
result.push_back(vec1[i]-vec2[j]);
}
break;
}
case '*':
{
for(int i=0;i<vec1.size();i++)
{
for(int j=0;j<vec2.size();j++)
result.push_back(vec1[i]*vec2[j]);
}
break;
}
}
return result;
}
bool isNum(string input)
{
for(int i=0;i<input.size();i++)
{
if(input[i]=='+'||input[i]=='-'||input[i]=='*')
return false;
}
return true;
}
vector<int> diffWaysToCompute(string input)
{
vector<int> result;
if(isNum(input))
{
vector<int> vec;
int sum=0;
int c=1;
for(int i=0;i<input.size();i++)
{
if(input[i]>='0'&&input[i]<='9')
{
sum=(input[i]-48)+sum*c;
c*=10;
}
}
vec.push_back(sum);
return vec;
}
for(int i=0;i<input.size();i++)
{
if(input[i]=='+'||input[i]=='-'||input[i]=='*')
{
string temp1=input.substr(0,i);
string temp2=input.substr(i+1);
vector<int> total=combine(diffWaysToCompute(temp1),diffWaysToCompute(temp2),input[i]);
for(int j=0;j<total.size();j++)
result.push_back(total[j]);
}
}
return result;
}
};
public:
vector<int> combine(vector<int> vec1,vector<int> vec2,char ch)
{
vector<int> result;
switch (ch)
{
case '+':
{
for(int i=0;i<vec1.size();i++)
{
for(int j=0;j<vec2.size();j++)
result.push_back(vec1[i]+vec2[j]);
}
break;
}
case '-':
{
for(int i=0;i<vec1.size();i++)
{
for(int j=0;j<vec2.size();j++)
result.push_back(vec1[i]-vec2[j]);
}
break;
}
case '*':
{
for(int i=0;i<vec1.size();i++)
{
for(int j=0;j<vec2.size();j++)
result.push_back(vec1[i]*vec2[j]);
}
break;
}
}
return result;
}
bool isNum(string input)
{
for(int i=0;i<input.size();i++)
{
if(input[i]=='+'||input[i]=='-'||input[i]=='*')
return false;
}
return true;
}
vector<int> diffWaysToCompute(string input)
{
vector<int> result;
if(isNum(input))
{
vector<int> vec;
int sum=0;
int c=1;
for(int i=0;i<input.size();i++)
{
if(input[i]>='0'&&input[i]<='9')
{
sum=(input[i]-48)+sum*c;
c*=10;
}
}
vec.push_back(sum);
return vec;
}
for(int i=0;i<input.size();i++)
{
if(input[i]=='+'||input[i]=='-'||input[i]=='*')
{
string temp1=input.substr(0,i);
string temp2=input.substr(i+1);
vector<int> total=combine(diffWaysToCompute(temp1),diffWaysToCompute(temp2),input[i]);
for(int j=0;j<total.size();j++)
result.push_back(total[j]);
}
}
return result;
}
};