2020-04-12 241. Different Ways to Add Parentheses

这个题目,一开始想的思路是 a ? b ? c ? d ? e ... 分解为 (a ? b) ? c ? d ? e ... 和 a ? (b ? c ? d ? e ...) 但是按照这个思路代码写不出来。看了一眼别人的代码,原来是按照每个运算符的位置,把问题分成两个子问题,然后递归求解。代码很简单,看一眼就知道怎么写的那种。但是感觉如果没有做过的话,很难一开始就想到这个方法。最后是分治+缓存解决。


class Solution {

    public List diffWaysToCompute(String input) {

        return ways(input, new HashMap<>());

    }


    List ways(String input, Map> cache) {

        {

            List cachedRes = cache.get(input);

            if (cachedRes != null) return cachedRes;

        }

        List res = new LinkedList<>();

        for (int i = 0; i < input.length(); i++) {

            char c = input.charAt(i);

            if ("+-*".indexOf(c) != -1) {

                List lefts = ways(input.substring(0, i), cache);

                List rights = ways(input.substring(i + 1), cache);

                for (Integer left : lefts) {

                    for (Integer right : rights) {

                        if (c == '+') {

                            res.add(left + right);

                        } else if (c == '-') {

                            res.add(left - right);

                        } else if (c == '*') {

                            res.add(left * right);

                        }

                    }

                }

            }

        }

        if (res.isEmpty()) {

            res.add(Integer.parseInt(input));

        }

        cache.put(input, res);

        return res;

    }

}

你可能感兴趣的:(2020-04-12 241. Different Ways to Add Parentheses)