# 282 Expression Add Operators

給一個string裡面都是數字,一個int target,在數字string中加入+,-,*,使總和變成target。

將可以總和成target的運算式存入List<String>中。

  • Idea: 一看到題目初步想法是列出所有可能的數字組合、並在數字組合中插入所有可能的運算符號組合。
  • Implementation: 實作上,可以用dfs recursion。這樣就可以把所有可能組合直接用argument記錄,不用額外空間儲存排列組合。 要注意處理乘法時,會有先乘除後加減的規則要處理,
    例如:1+3*4,會先得到1+3=4,但加上4之後,就需要做4-3 + 3*4的計算。
    另外,也要注意0開頭的數字是invalid的,例如0111這種直接不予計算。

  • pseudocode:

            dfs, recursively call dfs function. 
            dfs():
            in each iteration, 
            check if this is the end of num, and sum == target, if yes, put into list.
            for each possibility of this new number,
              dfs() with +, dfs() with -, dfs() with *
    
  • code:

    public class Solution {
        List<String> res = new ArrayList<>();
    
        public List<String> addOperators(String num, int target) {
            dfs(num, target, "", 0,0);
            return res;
        }
    
        void dfs(String num, int target, String str, long curSum, long prevNum){
            if(curSum == target && num.equals("")){
                res.add(str);
            }
    
            for(int i=1; i<=num.length(); i++){
                String curStr = num.substring(0,i);
    
                //number starts by 0 is invalid
                if(curStr.length() > 1 && curStr.charAt(0) == '0'){
                    return;
                }
    
                long curNum = Long.parseLong(curStr);
                String next = num.substring(i);
                if(!str.equals("")){
                    dfs(next, target, str+"*"+curStr, (curSum-prevNum)+prevNum*curNum, prevNum*curNum);
                    dfs(next, target, str+"+"+curStr, curSum+curNum, curNum);
                    dfs(next, target, str+"-"+curStr, curSum-curNum, -curNum);
                }else{
                    dfs(next, target, curStr, curNum, curNum);
                }
            }
        }
    }
    

results matching ""

    No results matching ""