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 -> []
给一个由数字构成的字符串,往其中添加+-*/号使得最后eval等于target,返回所有可能的添加方法。all combination想dfs。 由于乘法具有最高优先级, 因此要把上个合理的乘法因子存下来。 而且根据题意中间数字如果是"06"应该跳过。
Copy class Solution {
public :
void dfs(string &s, const int target, const int pos, const long cur, const long last, string path, vector<string> &res) {
if (pos == s . size ()) {
if (cur == target) res . push_back (path);
return ;
}
for ( int i = pos; i < s . size (); ++ i) {
if (pos != i && s [pos] == '0' ) break ;
const auto snum = s . substr (pos , i - pos + 1 );
const auto num = stol (snum);
if (pos == 0 ) {
dfs (s , target , i + 1 , cur + num , num , snum , res);
continue ;
}
dfs (s , target , i + 1 , cur + num , num , path + "+" + snum , res);
dfs (s , target , i + 1 , cur - num , - num , path + "-" + snum , res);
dfs (s , target , i + 1 , cur - last + last * num , last * num , path + "*" + snum , res);
}
}
vector < string > addOperators ( string num , int target) {
vector < string > res;
dfs (num , target , 0 , 0 , 0 , "" , res);
return res;
}
};
Copy class Solution {
private void helper ( String num , int target , int pos , long cur , String str , List < String > res , long last) {
if (pos == num . length ()) {
if (cur == target)
res . add (str);
return ;
}
for ( int i = pos; i < num . length (); i ++ ) {
if (i != pos && num . charAt (pos) == '0' ) {
break ; // To prevent '05'
}
long val = Long . parseLong ( num . substring (pos , i + 1 ));
if (pos == 0 ) {
helper(num , target , i + 1 , val , str + val , res , val) ;
} else {
helper(num , target , i + 1 , cur + val , str + "+" + val , res , val) ;
helper(num , target , i + 1 , cur - val , str + "-" + val , res , - val) ;
helper(num , target , i + 1 , cur - last + last * val , str + "*" + val , res , last * val) ;
}
}
}
public List < String > addOperators ( String num , int target) {
List < String > res = new ArrayList <>();
if ( num . length () == 0 ) {
return res;
}
helper(num , target , 0 , 0 , "" , res , 0 ) ;
return res;
}
}
时间复杂度O(3 ^ N).