题意
用字符串的形式给出一个由数字和+
,-
,*
给出的表达式,现在求表达式所有加入括号的情况的结果。
思路
分治法。
假设我们当前字符串的范围是[0, n - 1]。枚举一下操作符的位置k,即相当于(0, k - 1)加上括号,(k + 1, n - 1)加上括号。
我们统计一下(0, k - 1)
的所有计算结果为lh
,统计一下(k + 1, n - 1)
的所有结果为rh
。那么位置k上的所有结果为:
for (x in lh)
for (y in rh)
ans.push_back(x op y);
注意用vector
保存结果。
代码
class Solution {
public:
int cal(int x, int y, char op) {
if (op == '+') return x + y;
if (op == '-') return x - y;
return x * y;
}
vector<int> diffWaysToCompute(string input) {
int x = 0, i = 0;
while (isdigit(input[i])) {
x *= 10;
x += input[i++] - '0';
}
vector<int> ans;
if (i == input.size()) {ans.push_back(x); return ans;}
int n = input.size();
for (int i = 0; i < n; i++) {
if (!isdigit(input[i])) {
vector<int> lh = diffWaysToCompute(input.substr(0, i));
vector<int> rh = diffWaysToCompute(input.substr(i + 1, n - i - 1));
for (auto x : lh) {
for (auto y : rh) {
ans.push_back(cal(x, y, input[i]));
}
}
}
}
return ans;
}
};