• 282. Expression Add Operators


    题目:

    Given a string that contains only digits 0-9 and a target value, return all possibilities to add binary operators (not unary) +-, or * between the digits so they evaluate to the target value.

    Examples: 

    "123", 6 -> ["1+2+3", "1*2*3"] 
    "232", 8 -> ["2*3+2", "2+3*2"]
    "105", 5 -> ["1*0+5","10-5"]
    "00", 0 -> ["0+0", "0-0", "0*0"]
    "3456237490", 9191 -> []
    

    链接: http://leetcode.com/problems/expression-add-operators/

    题解:

    给定字符串和target num,求添加不同的运算符,使得字符串经过计算的值等于target num,要求所有的结果。 这道题好像以前小时候玩的数字游戏啊, 现在能用程序解决,真的很高兴。 代码主要参考了discuss里czonzhu的。要处理好几种边界条件,并且这里是用String进行cache,换成StringBuilder的话可能要多写不少行。需要注意的地方是,当i != position,并且position这个char的值为0时,我们不考虑接下来的运算,直接break,这个处理了case: "2" + "05"之类的。还有当position == "0"时,我们不加任何运算符号。因为有乘法运算,所以我们要cache之前的数字, 在backtracking的时候可以方便计算。  这样算下来,是否用doubly linked list来回溯可以处理更多的case,二刷时要尝试。

    Time Complexity - (4n), Space Complexity - (4n)

    public class Solution {
        public List<String> addOperators(String num, int target) {
            List<String> res = new ArrayList<>();
            if(num == null || num.length() == 0) {
                return res;
            }
            addOperators(res, "", num, target, 0, 0, 0);
            return res;
        }
        
        private void addOperators(List<String> res, String path, String numString, int target, int position, long curNum, long lastVal) {
            if(position > numString.length()) {
                return;
            }
            if(position == numString.length() && curNum == target) {
                res.add(path);
                return;
            }
            
            for(int i = position; i < numString.length(); i++) {
                if(i != position && numString.charAt(position) == '0') {   // pruning edge case:  "2" + "05", wrong cut
                    break;
                }
                long curVal = Long.parseLong(numString.substring(position, i + 1));
                if(position == 0) {
                    addOperators(res, path + curVal, numString, target, i + 1, curNum + curVal, curVal);
                } else {
                    addOperators(res, path + "+" + curVal, numString, target, i + 1, curNum + curVal, curVal);
                    addOperators(res, path + "-" + curVal, numString, target, i + 1, curNum - curVal, -curVal);
                    addOperators(res, path + "*" + curVal, numString, target, i + 1, curNum - lastVal + lastVal * curVal, lastVal * curVal);
                }
            }
        }
    }

    Reference:

    https://leetcode.com/discuss/58614/java-standard-backtrace-ac-solutoin-short-and-clear

    https://leetcode.com/discuss/58535/17-lines-solution-dfs-c

    https://leetcode.com/discuss/58547/accepted-c-solution

    https://leetcode.com/discuss/58876/ac-solution-c-short

    https://leetcode.com/discuss/61975/elegant-java-solution

    https://leetcode.com/discuss/70597/clean-python-dfs-with-comments

  • 相关阅读:
    XML介绍
    JavaScript基础
    pygame模块参数汇总(python游戏编程)
    CSS3
    CSS( Cascading Style Sheets )简书
    HTML5
    用python进行应用程序自动化测试(uiautomation)
    HTML入门
    Selenium2 (python)
    C#快速入门
  • 原文地址:https://www.cnblogs.com/yrbbest/p/5037881.html
Copyright © 2020-2023  润新知