Different Ways to Add Parentheses
class Solution {
public:
char gettoken(const string& s, int& pos, int& num) {
int n = s.length();
while (pos < n && s[pos] == ' ') {
++pos;
}
if (pos == n) {
return '\0';
}
if (s[pos] >= '0' && s[pos] <= '9') {
num = 0;
while (pos < n && s[pos] >= '0' && s[pos] <= '9') {
num = num * 10 + int(s[pos++] - '0');
}
return 'd';
}
return s[pos++];
}
vector<int> diffWaysToCompute(string input) {
vector<int> nums;
vector<char> ops;
int pos = 0, num = 0;
char op;
while (op = gettoken(input, pos, num)) {
if (op == 'd') {
nums.push_back(num);
} else {
ops.push_back(op);
}
}
int n = nums.size();
vector<vector<vector<int> > > vst(n);
for (int i = 0; i < n; ++i) {
vst[i].resize(n);
vst[i][i].push_back(nums[i]);
}
for (int len = 2; len <= n; ++len) {
for (int i = 0; i + len <= n; ++i) {
int j = i + len - 1;
for (int k = i; k < j; ++k) {
for (vector<int>::iterator itr1 = vst[i][k].begin(); itr1 != vst[i][k].end(); ++itr1) {
for (vector<int>::iterator itr2 = vst[k + 1][j].begin(); itr2 != vst[k+1][j].end(); ++itr2) {
int val = 0;
switch (ops[k]) {
case '+': val = *itr1 + *itr2; break;
case '-': val = *itr1 - *itr2; break;
case '*': val = *itr1 * *itr2; break;
}
vst[i][j].push_back(val);
}
}
}
}
}
return vst[0][n-1];
}
};