[LeetCode] Expression Add Operators
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,注意*的优先级高,所以要记录当前最后一个操作数(*表达式)的值。注意整形溢出,用long long来存中间结果。
1 class Solution { 2 public: 3 void dfs(vector<string> &res, string num, string out, int target, long long diff, long long curVal) { 4 if (num.empty() && curVal == target) { 5 res.push_back(out); 6 return; 7 } 8 string curNum, nextNum; 9 for (int i = 1; i <= num.size(); ++i) { 10 curNum = num.substr(0, i); 11 nextNum = num.substr(i); 12 if (curNum.size() > 1 && curNum[0] == '0') return; 13 if (out.empty()) { 14 dfs(res, nextNum, curNum, target, stoll(curNum), stoll(curNum)); 15 } else { 16 dfs(res, nextNum, out + "+" + curNum, target, stoll(curNum), curVal + stoll(curNum)); 17 dfs(res, nextNum, out + "-" + curNum, target, -stoll(curNum), curVal - stoll(curNum)); 18 dfs(res, nextNum, out + "*" + curNum, target, diff * stoll(curNum), curVal - diff + diff * stoll(curNum)); 19 } 20 } 21 } 22 vector<string> addOperators(string num, int target) { 23 vector<string> res; 24 dfs(res, num, "", target, 0, 0); 25 return res; 26 } 27 };