给表达式添加运算符

给表达式添加运算符

给定一个仅包含数字 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;
    }
};
posted @ 2021-10-21 20:57  荣荣荣荣荣荣  阅读(184)  评论(0)    收藏  举报