回溯+加减乘+for循环每种数字 282. 给表达式添加运算符

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后面不能跟数字;

你可能感兴趣的:(leetcode,DFS)