282. 给表达式添加运算符
思路:回溯 O ( n 4 ) O(n^4) O(n4)
通过传入每一位,上一次计算的数字,当前表达式的值和计算的字符串参数,每次枚举这次数字的长度,使用不同的运算法计算
因为每个数字之间可以是不填、 + + +、 − - −、 ∗ * ∗所以是四次方的复杂度
class Solution {
public:
typedef long long LL;
vector<string> res;
string s;
int t, n;
vector<string> addOperators(string num, int target) {
s = num;
t = target;
n = num.size();
// 枚举到位数 上一次需要计算的数字 当前表达式的值 计算的表达式
dfs(0, 0, 0, "");
return res;
}
string cal = "+-*";
void dfs(int u, LL pre, LL sum, string cur) {
if (u == n) {
if (sum == t) res.push_back(cur);
return ;
}
for (int i = u; i < n; i ++ ) {
if (i != u && s[u] == '0') break;
int len = i - u + 1;
string ss = s.substr(u, len);
LL next = stoll(ss);
if (!u) dfs(u + len, next, next, cur + ss);
else {
dfs(u + len, next, sum + next, cur + '+' + ss);
dfs(u + len, -next, sum - next, cur + '-' + ss);
LL x = pre * next;
dfs(u + len, x, sum - pre + x, cur + '*' + ss);
}
}
}
};