给表达式添加运算符

题目:力扣

解题思路:回溯法,

想了好久总算想明白了,太不容易了。。

class Solution {
    int target;
    String num;
    List<String> res;
    char[] expr;
    int num_len;
    public List<String> addOperators(String num, int target) {
        this.target = target;
        this.num = num;
        this.num_len = num.length();
        this.res = new ArrayList<String>();
        expr = new char[2*num_len];
        backtrack(0,0,0,0);
        return res;
    }
    //params : start:开始选取数字的位置 ,expr_len:当前表达式的长度,curValue:当前表达式的算术值
//preValue:前面的选取的数字的数值(带符号的数字,*要注意preValue是前面两个数的乘积,例如当前表达式为1+2,则preValue为2,curValue为3,1-2的话,preValue=-2,curValue = -1,1*2的话,preValue = 1*2=2,curValue = 1*2 = 2)
    public void backtrack(int start, int expr_len, long curValue, long preValue){
        //如果数字用完了,表示表达式完成了
        if(start == num_len){
            //若当前表达式的值等于target,则添加该表达式,否则返回
            if(curValue == target){
                res.add(new String(expr, 0, expr_len));
            }
            return;
        }
        long n = 0;
        int index = start;
        int sign_pos = expr_len;
        if(start != 0){
            expr_len++;
        }
        while(index < num_len){
            n = n*10 + num.charAt(index) - '0';
            if(num.charAt(start) == '0' && index - start > 0){
                return;
            }
            expr[expr_len] = num.charAt(index);
            expr_len++;
            index++;
            if(start == 0){
                backtrack(index,expr_len,n, n);
                continue;
            }
            expr[sign_pos] = '+';
            backtrack(index, expr_len, curValue + n, n);
            expr[sign_pos] = '-';
            backtrack(index, expr_len, curValue - n, -n);
            expr[sign_pos] = '*';
            backtrack(index, expr_len, curValue - preValue + preValue*n, preValue*n);
        }

    }
}

 

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务