1. 程式人生 > >給表達式添加運算符

給表達式添加運算符

asto 優先 包含 clas 窮舉 表達 return tor back

給定一個僅包含數字 0-9 的字符串和一個目標值,在數字之間添加二元運算符(不是一元)+、- 或 * ,返回所有能夠得到目標值的表達式。

示例 1:
輸入: num = "123", target = 6
輸出: ["1+2+3", "123"]

示例 2:
輸入: num = "232", target = 8
輸出: ["23+2", "2+32"]

示例 3:
輸入: num = "105", target = 5
輸出: ["1*0+5","10-5"]

示例 4:
輸入: num = "00", target = 0
輸出: ["0+0", "0-0", "0*0"]

class Solution {
public:
    vector<string> addOperators(string num, int target) {
        vector<string> result;
        addOperatorsDFS(num, target, 0, 0, "", result);
        return result;
    }
    //lastOperaNum上一次添加的操作數(用於*法回退)
    void addOperatorsDFS(string num, int target, long long lastOperaNum, long long curNum, string tempRes, vector<string> &result) {
        if (num.size() == 0 && curNum == target) {//此次運算符添加成功
            result.push_back(tempRes);
            return;
        }
        //對添加運算符的位置窮舉
        for (int i = 1; i <= num.size(); ++i)
        {
            string cur = num.substr(0, i);
            if (cur.size() > 1 && cur[0] == ‘0‘) {//剪枝   cur不能出現“012”這種,即不能出現前導零
                return;
            }
            string next = num.substr(i);//cur之後的字符串
            if (tempRes.size() > 0) {//如果cur不是第一個操作數
                //嘗試添加加,這次添加的操作數lastOperaNum == stoll(cur)
                addOperatorsDFS(next, target, stoll(cur), curNum + stoll(cur), tempRes + "+" + cur, result);
                //嘗試添加減,這次添加的操作數lastOperaNum == -stoll(cur)
                addOperatorsDFS(next, target, -stoll(cur), curNum - stoll(cur), tempRes + "-" + cur, result);
                //嘗試添加乘
                //由於乘法的優先級比加、減法高,所以需要回退到上一步,即把上一步的操作數與乘法進行運算
                //這次添加的操作數lastOperaNum == lastOperaNum * stoll(cur)
                //(curNum - lastOperaNum)是退回上一次的操作數,然後在進行乘法運算   + lastOperaNum * stoll(cur)
                addOperatorsDFS(next, target, lastOperaNum * stoll(cur), (curNum - lastOperaNum) + lastOperaNum * stoll(cur), tempRes + "*" + cur, result);
            }
            else {//如果是第一個操作數
                addOperatorsDFS(next, target, stoll(cur), stoll(cur), cur, result);
            }
        }
    }
};

給表達式添加運算符