给定一个仅包含数字 0-9 的字符串和一个目标值,在数字之间添加二元运算符(不是一元)+、- 或 * ,返回所有能够得到目标值的表达式。
示例 1:
输入: num = “123”, target = 6
输出: [“1+2+3”, “123”]
示例 2:
输入: num = “232”, target = 8
输出: [“23+2", "2+32”]
示例 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
输出: []
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/expression-add-operators
class Solution {
public:
vector <string> ans;
inline long long int stoll1(string num)
{
long long int res=0;
for(int i=0;i<num.size();i++)
{
res=res*10-'0'+num[i];
}
return res;
}
vector<string> addOperators(string num, int target) {
if(num.size() == 0) return vector<string>{};
if( target!=0 && num[0]!='0' && (target > stoll1(num) || target <= -stoll1(num))) return vector<string>{};
if(target!=0 && num[0]!='0' && target == stoll1(num))
return vector<string>{num};
string str="";
dfs(num,target,str,0,0);
return ans;
}
//curnum当前值,prenum前一个表达式的值为了乘法而设
void dfs(string num,int target,string str,long long int curnum,long long int prenum)
{
if(num.size()==0 && curnum == target)
{
ans.push_back(str);
return ;
}
for(int i=1;i<=num.size();i++)
{
string curstr=num.substr(0,i);
//去掉0x 0开头的数字
if(curstr.size()>1 && curstr[0] == '0')
return ;
string nextstr=num.substr(i);
long long int cur=stoll1(curstr);
if(str.size() == 0)
{
dfs(nextstr,target,curstr,cur,cur);
}
else
{
// +
dfs(nextstr,target,str+'+'+curstr,curnum+cur,cur);
// -
dfs(nextstr,target,str+'-'+curstr,curnum-cur,-cur);
// *
dfs(nextstr,target,str+'*'+curstr,curnum-prenum+cur*prenum,cur*prenum);
}
}
}
};