给表达式添加运算符
给表达式添加运算符
给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,返回所有能够得到目标值的表达式。
示例 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
输出: []
难点:
①:有多位数,这些数字可不都是光有个位数。
②:0 的特殊性。它可以作为一个数字出现,但不能是多位数的首位。
③:在中间添加运算符,也就是说在加入第一个数的时候是不添加运算符的,运算符数量至少比数字数量少一。
解决方法:
①:每次更新 a 的值;
for(int i = index; i < n; i++){
a = a * 10 + Num[i] - '0';
}
②:当前位置是首位 或者 首位的那个数字不是 0。
i == index || Num[index] != '0'
③:如果当前位置是首位的时候,只能进入唯一 的 dfs 入口。
if(index == 0){
dfs(i + 1, s + to_string(a), a, a);
}else{
dfs(i + 1, s + '+' + to_string(a), sum + a, a);
……
}
思路:
设置字符串 s 储存答案,以及变长数组 ans 储存每个字符串 s 。
设置变量 a,记录每次要放入 s 的数字(可能是多位数).利用 dfs 搜索,把每一步放入 s ,并记录每次的 cnt ,和总和 sum 。
dfs 详解:
在已经找到要放入的数之后,就是 ' + ', ' - ', ' * ', 这三种情况的选择问题了,按个试就OK。。
第一种,中间是+,则sum加上第ii段数字。
第二种,中间是−,则sum减去第ii段数字。
第三种,中间是×,则sum减去上一段连续乘的值(因此我们需要在递归的时候记录上一段的值,对于第i段数字,即记录第i-1的数字是多少),再加上 第i-1段数字×第i段数字。
class Solution {
public:
vector<string > ans;
string Num;
int Target, n;
void dfs(int index, string s,long long sum, long long cnt){
long long a = 0;
if(index == n){
if(sum == Target) ans.push_back(s);
return;
}
for(int i = index; i < n && (i == index || Num[index] != '0'); i++){
a = a * 10 + Num[i] - '0';
if(index == 0){
dfs(i + 1, s + to_string(a), a, a);
}else{
dfs(i + 1, s + '+' + to_string(a), sum + a, a);
dfs(i + 1, s + '-' + to_string(a), sum - a, -a);
dfs(i + 1, s + '*' + to_string(a), sum - cnt + cnt * a,cnt * a);
}
}
}
vector<string> addOperators(string num, int target) {
Num = num;
Target = target;
n = num.size();
dfs(0, "", 0, 0);
return ans;
}
};

浙公网安备 33010602011771号