由于输出的表达式一定是合法的,且没有多余的字符串,因此我们对于任意一个运算符,可以分将这个运算符拆成左右两个运算符,递归解决左右两个子问题。解决完以后,然后合并成答案。
这里有两种方法,一种先做一个parse,将多位数字提前解析好,另一种不需要解析,直接对字符串进行处理,这种情况下Python实现起来更优雅。
优雅的Python代码
class Solution:
def diffWaysToCompute(self, expression: str) -> List[int]:
op = ['*', '+', '-']
if expression.isdigit():
return [int(expression)]
res = []
for i, c in enumerate(expression):
if c in op:
left = self.diffWaysToCompute(expression[:i])
right = self.diffWaysToCompute(expression[i+1:])
for l in left:
for r in right:
if c == '*':
res.append(l * r)
elif c == '+':
res.append(l + r)
elif c == '-':
res.append(l - r)
return res
下面是C++代码,由于C++ string不容易直接isdigit,因此需要这样写
class Solution {
public:
vector<int> diffWaysToCompute(string expression) {
vector<int> res;
for(int i = 0; i < expression.size(); i++) {
char c = expression[i];
if (c == '*' || c == '-' || c == '+') {
auto l = diffWaysToCompute(expression.substr(0, i));
auto r = diffWaysToCompute(expression.substr(i + 1));
for (auto v1 : l) {
for(auto v2 : r) {
switch(c) {
case '+' : res.push_back(v1 + v2); break;
case '-' : res.push_back(v1 - v2); break;
case '*' : res.push_back(v1 * v2); break;
}
}
}
}
}
if(res.size() == 0) {
res.push_back(stoi(expression));
}
return res;
}
};