这道题基本属于典型无脑dfs,跟word break有一点点的类似,都是给一个长串字母然后进行分割。
但是要注意的是如果要添加乘法运算符,需要先减去上一个添加的值然后再添加当前新的值和上一个值的乘积。
看了一下基本网上所有人都是这个解法,不知道lc那些400ms以内的人怎么做的。。
这道题有几个药注意的点
1. 持续追踪上次一运算用的值。在迭代的时候替换为当前值,记得根据当前运算符不同而进行改变。
2. 剔除0开头的多位数。所以20行为return不是contunie
3. 用long long保存中间值,因为可能溢出
4. start为0的时候,处理方法和后期有点不同,要分开考虑
5.dfs的时候有些传入参数可以用const,const string可以用&,快一丢丢
class Solution {
public:
vector<string> addOperators(string num, int target) {
vector<string> res;
string temp;
helper(res, num, temp, target, 0, 0, 0);
return res;
}
void helper(vector<string>& res, const string& nums, string temp, const int target, int start, long long pre_val, long long cur_res){
if(start==nums.size()){
if(cur_res==target){
res.push_back(temp);
}
return;
}
for(int i=1;i+start<=nums.size();++i){
string num=nums.substr(start,i);
if(num.size()>1&&num[0]=='0')
return;
long long cur=stoll(num);
if(start==0){
helper(res, nums, num, target, i, cur, cur);
}
else{
helper(res, nums, temp+"+"+num, target, start+i, cur, cur_res+cur);
helper(res, nums, temp+"-"+num, target, start+i, -cur, cur_res-cur);
helper(res, nums, temp+"*"+num, target, start+i, pre_val*cur, cur_res-pre_val+pre_val*cur);
}
}
}
};
今天上班超级累,偷懒写了无脑dfs。。。= =