282. Expression Add Operators及变种

详细讲解:https://www.youtube.com/watch?v=v05R1OIIg08
自己的理解:

282. Expression Add Operators及变种_第1张图片
image.png

中间for那里注意一下,从i = pos开始,那么我们的t就从num.substring(pos, pos + 1)一直到num.substring(pos, nums.length) 所以我们的i就是从pos到nums.length - 1, substring的尾部取的是i + 1. 注意这里要判断t是不是以0开始并且长度大于1,如果是就非法,直接break 出来;同时要考虑pos==0的特殊情况,因为此时我们没有operator, 我们自动默认赋加号。这个时候我们在此基础上继续dfs,要把把exp变为刚刚读出来的数,prev, curt都更新为这个,只有pos要变成i+1.
其他情况我们继续搜索,更新prev, curt, exp, pos变成i + 1.

class Solution {
    public List addOperators(String num, int target) {
        List res = new ArrayList<>();
        if (num == null || num.length() == 0){
            return res;
        }
        StringBuilder sb = new StringBuilder();
        dfs(num, target, 0, sb, 0, 0, res);
        return res;
    }
    
    //prev : last node val
    //curt : curt exp val
    private void dfs(String num, int target, int pos, StringBuilder exp, long prev, long curt, List res){
        if (pos == num.length()){
            if (curt == target){
                res.add(exp.toString());
                return;
            }
        }
        for (int i = pos; i < num.length(); i++){
            //t = s.substring(pos, pos + 1) to t = s.substring(pos, nums.length)
            String t = num.substring(pos, i + 1);
            if (t.length() > 1 && t.charAt(0) == '0'){//0X  00 05
                break;
            }
            long n = Long.parseLong(t);
            int len = exp.length();
            if (pos == 0){// no operator yet
                //t = s.substring(0, i + 1) 下一个从s.charAt(i + 1)开始处理 pos = i + 1
                //123 要处理1 12 123三种情况,所以要continue不能break
                dfs(num, target, i + 1, exp.append(t), n, n, res);
                exp.setLength(len);
                continue;
            }
            dfs(num, target, i + 1, exp.append("+").append(t), n, curt + n, res);
            exp.setLength(len);
            dfs(num, target, i + 1, exp.append("-").append(t), -n, curt - n, res);
            exp.setLength(len);
            dfs(num, target, i + 1, exp.append("*").append(t), prev * n, curt - prev + prev * n, res);
            exp.setLength(len);
        }
    }
}

变种是给一个字符串,全部由数字组成,再给一个int target,要求在字符串里插入+或者-,使字符串的表达式值刚好等于target,返回number of solutions。

你可能感兴趣的:(282. Expression Add Operators及变种)