282. 给表达式添加运算符
给定一个仅包含数字 0-9 的字符串和一个目标值,在数字之间添加二元运算符(不是一元)+、- 或 * ,返回所有能够得到目标值的表达式。
示例 1:
输入: num = "123", target = 6
输出: ["1+2+3", "1*2*3"]
示例 2:
输入: num = "232", target = 8
输出: ["2*3+2", "2+3*2"]
示例 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
输出: []
解题
注意使用stoi,stol
可以快速把字符串转化为int和long格式;
回溯:分三种
(1)+
(2)-
(3)*,乘法要记录每次的被乘数
注意点
因为数字可以组合,故每次遍历需要for循环遍历所有当前的组合方式!
class Solution {
public:
vector<string> addOperators(string num, int target) {
this->num=num;
string track="";
backtrack(target,0,0,1);
return result;
}
private:
vector<string> result;
string tmp;
string num;
//注:mult表示的上一步的操作数
void backtrack(int target,int index,long val,long mult)
{
if(index==num.size())
{
if(val==target)result.push_back(tmp);
return;
}
int len=tmp.size();
//从1开始遍历要添加的长度
for(int i=index;i<num.length();i++)
{
string subval=num.substr(index,i-index+1);
long long n=stol(subval);
if(!index) {
tmp+=subval;
backtrack(target,i+1,n,n);
tmp.resize(len); //回溯
}
else{
//+
tmp+="+"+subval;
backtrack(target,i+1,val+n,n);
tmp.resize(len);
//-
tmp+="-"+subval;
backtrack(target,i+1,val-n,-n);
tmp.resize(len);
//*
tmp+="*"+subval;
backtrack(target,i+1,val-mult+mult*n,mult*n);
tmp.resize(len);
}
if(n==0) return; //0打头则无需往后遍历多个!
}
return;
}
};
易错点
若第一次遍历,取第一个数为0时,无需继续for循环在0后面取数,直接return就行,因为0后面不能跟数字;