给表达式添加运算符
给表达式添加运算符
给定一个仅包含数字 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; } };