https://leetcode-cn.com/problems/expression-add-operators/
思路:很明显的回溯了吧。。考虑每个位置的运算符种类有三种以及数字可以连起来,那么相当于每个位置有四种选择,直接暴力计算时间复杂度为
O
(
4
n
)
O(4^{n})
O(4n),考虑
n
n
n最大不过等于10,还是可以通过滴~需要注意的一个细节问题是,如果以位置
i
i
i为一个数的起始,且其为0,那么后续就不能再跟其他数字了!
class Solution {
public:
vector<string> addOperators(string num, int target) {
vector<string> ans;
using ll=long long;
string expr;
function<void(int, ll, ll)> cal=[&](int pos, ll val, ll pre)
{
int n=num.size();
if(pos>=n)
{
if(val==target)
ans.push_back(expr);
return;
}
int curSize=expr.size();
if(pos>0)
expr+=' ';
ll curVal=0;
for(int i=pos;i<n;i++)
{
int posVal=num[i]-'0';
curVal=curVal*10+posVal;
expr+=num[i];
if(pos==0)
cal(i+1, curVal, curVal);
else
{
expr[curSize]='+';
cal(i+1, val+curVal, curVal);
expr[curSize]='-';
cal(i+1, val-curVal, -curVal);
expr[curSize]='*';
cal(i+1, val-pre+curVal*pre, curVal*pre);
}
if(i==pos&&num[pos]=='0')
break;
}
expr.resize(curSize);
};
cal(0, 0, 0);
return ans;
}
};