Given a string that contains only digits 0-9
and a target value, return all possibilities to add binary operators (not unary) +
, -
, or *
between the digits so they evaluate to the target value.
Examples:
"123", 6 -> ["1+2+3", "1*2*3"] "232", 8 -> ["2*3+2", "2+3*2"] "105", 5 -> ["1*0+5","10-5"] "00", 0 -> ["0+0", "0-0", "0*0"] "3456237490", 9191 -> []
思路:dfs,注意这种情况当我们算出来a+b 之后,需要*c,如果直接运算,得道的结果是(a+b)*c, 与预期结果不服,所以我们只要在(a+b)*c的结果上减去(c-1)*a就可以了。所以进行递归传值的时候,我们需要用(a+b)*c-(c-1)*a来计算当前结果。 a永远是乘法前第一个加或者减的运算。
代码如下:
class Solution {
private:
vector<string> result;
int target;
int size;
string num;
public:
vector<string> addOperators(string num, int target) {
this->target = target;
this->num = num;
this->size = num.size();
string solu;
dfs(solu,0,0,0);
return result;
}
void dfs(string solu,int idx,long sum,int a) {
if (idx == size && sum == target) {
result.push_back(solu);
return;
}
for (int len = 1; idx+len-1 < size; len++) {
if (idx == 0) {
string cur = num.substr(idx,len);
if (cur[0] == '0' && cur.size() > 1) continue;
long c = stol(cur);
dfs(solu+cur,idx+len,c,0);
} else {
string cur = num.substr(idx,len);
if (cur[0] == '0' && cur.size() > 1) continue;
long c = stol(cur);
//+
dfs(solu+"+"+cur,idx+len,sum+c,sum);
//-
dfs(solu+"-"+cur,idx+len,sum-c,sum);
//*
dfs(solu+"*"+cur,idx+len,sum*c-(c-1)*a,a);
}
}
}
};