LeetCode刷题实战282:给表达式添加运算符
Given a string num that contains only digits and an integer target, return all possibilities to add the binary operators '+', '-', or '*' between the digits of num so that the resultant expression evaluates to the target value.
示例
示例 1:
输入: num = "123", target = 6
输出: ["1+2+3", "1*2*3"]
示例 2:
输入: num = "232", target = 8
输出: ["2*3+2", "2+3*2"]
示例 3:
输入: num = "105", target = 5
输出: ["1*0+5","10-5"]
示例 4:
输入: num = "00", target = 0
输出: ["0+0", "0-0", "0*0"]
示例 5:
输入: num = "3456237490", target = 9191
输出: []
解题
typedef long long LL; // 中间结果可能爆int,需要long long来存
class Solution {
public:
vector<string> res;
string path; // path存放当前方案
void dfs(string& num, int u, int len, LL a, LL b, LL target) { // u是当前搜索到了字符串num的位置,len是当前方案path的长度
if(u == num.size()) { // 如果搜索到了num的最后一个位置('+')
if(a == target) { // 这时a存放的就是当前方案下字符串num的值
res.push_back(path.substr(0, len - 1)); // len - 1是因为最后一位是'+'
}
} else {
LL c = 0; // c是我们当前要搜索的数
for(int i = u; i < num.size(); ++i) {
c = c * 10 + num[i] - '0';
path[len++] = num[i]; // 先把这个数加到方案path里
path[len] = '+'; // 搜索'+'的方案
dfs(num, i + 1, len + 1, a + b * c, 1, target); // a更新为a + b * c, b更新为1
if(i + 1 < num.size()) { // 如果没到倒数第二位,说明还有插入'-'和'*'的方案
path[len] = '-';
dfs(num, i + 1, len + 1, a + b * c, -1, target); // a, b的更新之前已经分析过了
path[len] = '*';
dfs(num, i + 1, len + 1, a, b * c, target);
}
if(num[u] == '0') { // 不能有前导0
break;
}
}
}
}
vector<string> addOperators(string num, int target) {
path.resize(100); // 因为搜索的复杂度是指数级的,所以path长度不可能太长
dfs(num, 0, 0, 0, 1, target); // 最开始a是0,b是1,表示 0 + 1 * (整个num表达式可能的取值)
return res;
}
};