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 -> []
Credits:
Special thanks to @davidtan1890 for adding this problem and creating all test cases.
给定一个由数字字符组成的字符串,在任意字符之间加入+、-、*构成数学表达式,使得表达式的结果为所给的target
AC代码:
class Solution
{
public:
vector<string> addOperators(string num, int target)
{
vector<string> res;
string temp="";
int len=num.size();
for(int i=1; i<=len; ++i)
{
string curString=num.substr(0,i);
if(curString.size()>1&&curString[0]=='0')
continue;
string nextString=num.substr(i,len-i);
long long curNum=stringToLonglong(curString);
temp="";
cal(nextString,target,curNum,curNum,curString,res);
}
return res;
}
private:
long long stringToLonglong(string s)
{
stringstream ss;
ss<<s;
long long res;
ss>>res;
return res;
}
void cal(string num,int target,long long last,long long cur,string temp,vector<string> &res)
{
int len=num.size();
if(len==0&&target==cur)
{
res.push_back(temp);
return ;
}
for(int i=1; i<=len; ++i)
{
string curString=num.substr(0,i);
string nextString=num.substr(i,len-i);
if(curString.size()>1&&curString[0]=='0')
return ;
long long curNum=stringToLonglong(curString);
cal(nextString,target,curNum,cur+curNum,temp+"+"+curString,res);
cal(nextString,target,-curNum,cur-curNum,temp+"-"+curString,res);
cal(nextString,target,last*curNum,cur-last+last*curNum,temp+"*"+curString,res);
}
}
};
注意:int容易溢出;000、012...数字违法、字符串组成的数字也可以为target
其他leetcode题目AC代码:https://github.com/PoughER