分而治之——Different Ways to Add Parentheses
来源:互联网 发布:python股票分析系统 编辑:程序博客网 时间:2024/06/06 05:07
问题描述:
给定一个含有数字和运算符的字符串,用所有不同的可能的方法计算所有可能的结果。 有效的运算符是+, - 和*。
解题思路:
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;
}
};
0 0
- 分而治之——Different Ways to Add Parentheses
- LeetCode241——Different Ways to Add Parentheses
- LeetCode题解——Different Ways to Add Parentheses
- leetcode——Different Ways to Add Parentheses
- Different Ways to Add Parentheses——Difficulty:Medium
- Leetcode——241. Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- Different Ways to Add Parentheses
- java中获取服务器的IP和端口
- 大三软件工程小项目-小技术集合-服务端连接MySQL及对表插入、删除、查询
- react-native热更新闪屏问题
- git使用详解
- 11款PHP集成开发环境
- 分而治之——Different Ways to Add Parentheses
- Retrofit上传图文
- Rancher如何按计算资源调度
- HDU1159
- SQL主键简单表述
- OpenCV关于视频处理的学习(VideoCapture类)-在检测中一些必要的图像操作
- preprocess函数
- oj1045: 输入一个数插入有序数组中
- mysql的事务性,锁和隔离性