题目描述:
给定一个仅包含数字 0-9 的字符串和一个目标值,在数字之间添加二元运算符(不是一元)+、- 或 * ,返回所有能够得到目标值的表达式。
思路:
对于"+“和”-" 只需要在原来的结果上"+“或者”-“当前的数即可
对于” * “,因为有运算符优先级,则需要特殊处理
例如:1 3 2
一些操作后:1+3 然后用上” * “时,
则需要记录上一个数mult(3),
上一次的结果val(4)
当前数字n(2)
进行”"操作后:1+(32)=val-mult+mult*n
代码如下:
class Solution {
public:
vector<string> addOperators(string num, int target) {
vector<string>res;
vector<string> track;
backtrack(num,target,0,0,1,res,track);
return res;
}
void backtrack(string num,int target,int idx,long val,long mult,vector<string>&res,vector<string>& track){
if(idx==num.size()){
if(val==target){
string temp="";
for(auto t:track){
temp+=t;
}
res.push_back(temp);
}
return;
}
for(int i=idx;i<num.size();i++){
//转换数字
string sval=num.substr(idx,i-idx+1);
long n=stol(sval);
//第一个数字不需要加符号
if(idx==0){
track.push_back(sval);
backtrack(num,target,i+1,n,n,res,track);
track.pop_back();
}
else{
//+
track.push_back("+");
track.push_back(sval);
backtrack(num,target,i+1,val+n,n,res,track);
track.pop_back();
track.pop_back();
//-
track.push_back("-");
track.push_back(sval);
backtrack(num,target,i+1,val-n,-n,res,track);
track.pop_back();
track.pop_back();
//*
track.push_back("*");
track.push_back(sval);
backtrack(num,target,i+1,val-mult+mult*n,mult*n,res,track);
track.pop_back();
track.pop_back();
}
//首位如果是0就跳出循环,不然就会出现05,055等非法数字
if(n==0) return;
}
}
};