题意:给定只有0-9组成的字符串,在字符串加上二元+-*使之成为一个算式,其结果等于指定的一个数
思路1:首先枚举组成算式,再用栈进行计算。但是在栈的时间耗费太长,超时
思路2:这个是我从网上找的。递归加运算符号。用cur表示当前值,用diff表示变化值,这个思路比较巧妙,+和-的diff和cur比较好理解。*的不太好理解,多理解就发现巧妙之处了,上代码。
class Solution {
public:
vector<string> addOperators(string num, int target) {
vector<string> res;
check(num,target,0,0,"",res);
return res;
}
void check(string num,long long target,long long cur,long long diff,string out,vector<string> &res)
{
if(num.size()==0)
{
if(cur==target) res.push_back(out);
return;
}
int i;
for(i=1;i<=num.size();i++)
{
string c=num.substr(0,i);
if(c.size()>1&&c[0]=='0') break;
string n=num.substr(i);
if(out.size()>0)
{
check(n,target,cur+stoll(c),stoll(c),out+"+"+c,res);
check(n,target,cur-stoll(c),-stoll(c),out+"-"+c,res);
check(n,target,cur-diff+diff*stoll(c),diff*stoll(c),out+"*"+c,res);
}
else
{
check(n,target,stoll(c),stoll(c),c,res);
}
}
}
};