您的位置:首页 > Web前端

241. Different Ways to Add Parentheses(week 2)

2017-03-03 15:52 274 查看

思路

这周选了分而治之的题目,这道middle题用的也是这个方法,但是,这个算法还可以继续优化,就像斐波拉契数列一样优化,用空间换时间,把已经算出来的字符串的所有可能的答案保存起来,这样就保证了,不再会出现重复计算的冗余时间。

对于一个表达式 a - b, a与b均为表达式,计算a - b的结果 我们需要先知道a的结果与b的结果。对于知道加parentheses的题,只要对表达中的每一个运算符都做这样的操作并递归,就可以得出所有可能结果,希望下面的例子可以帮助理解

2 * 3 - 4 * 5
/        |             \
(2) * (3 - 4 * 5)  (2 * 3) - (4 * 5)   (2 * 3 - 4) * (5)
/          \
(3 - 4 ) * 5     3 - (4 * 5)
/    \
3     4


#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
vector<int> diffWaysToCompute(string input) {
int inputLength = input.length();
vector<int> res;
for (int i = 0; i <inputLength; i++){
if(input[i] == '+' || input[i]=='-' ||input[i]=='*' ){
vector<int> l = diffWaysToCompute(input.substr(0,i));
vector<int> r = diffWaysToCompute(input.substr(i+1,inputLength-i-1));
for(vector<int>::size_type j = 0; j < l.size(); j++)
for(vector<int>::size_type k = 0; k< r.size(); k++){
switch (input[i]){
case '+':
res.push_back(l[j]+r[k]);
break;
case '-':
res.push_back(l[j]-r[k]);
break;
case '*':
res.push_back(l[j]*r[k]);
break;

}
}

}
}
if(!res.size())res.push_back(atoi(input.c_str()));
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: