我也想的是用分治算法来解,但是关于子问题的规划,总是没有找到合适的办法,导致自己想的过于复杂,我觉得分治算法,对于一个序列来说,可以先看一种简单的情况,就比如是对于2+3*1;这样的小问题,采取分治来解,之前我想的分治都是把这样一个序列给分开,但是这里加括号,必须前后都是有联系的,所以,应该是每次都应该把原序列分成不同大小的部分,然后来解;对于
2+3*1,这样的小问题,无非就是把2当成左边,运算符留下,然后将3*1化成另一个小问题,返回一个值,或者是2+3作为一个子问题,*运算符留下,1当作另一个子问题来看;因为再长的序列都可以最终看成是这样的一个问题。下面是代码:(这里借用了别人的代码)
class Solution {
public:
vector<int> diffWaysToCompute(string input) {
vector<int> result;
int size = input.size();
for (int i = 0; i < size; i++) {
char cur = input[i];
if (cur == '+' || cur == '-' || cur == '*') {
// Split input string into two parts and solve them recursively
vector<int> result1 = diffWaysToCompute(input.substr(0, i));
vector<int> result2 = diffWaysToCompute(input.substr(i+1));
for (auto n1 : result1) {
for (auto n2 : result2) {
if (cur == '+')
result.push_back(n1 + n2);
else if (cur == '-')
result.push_back(n1 - n2);
else
result.push_back(n1 * n2);
}
}
}
}
// if the input string contains only number
if (result.empty())
result.push_back(atoi(input.c_str()));
return result;
}
};