LeetCode: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.

Example 1:

Input: num = "123", target = 6
Output: ["1+2+3", "1*2*3"] 

Example 2:

Input: num = "232", target = 8
Output: ["2*3+2", "2+3*2"]

Example 3:

Input: num = "105", target = 5
Output: ["1*0+5","10-5"]

Example 4:

Input: num = "00", target = 0
Output: ["0+0", "0-0", "0*0"]

Example 5:

Input: num = "3456237490", target = 9191
Output: []

解题思路 —— 递归求解

递归列举出所有出符合要求的表达式,需要注意的是表达式的每个数字不能有前置零

AC 代码

 func mulOperators(num string) map[string] int{
    ans := make(map[string] int)
    
    for i := 1; i < len(num); i++{
        // 前置 0 无效
        if i != 1 && num[0] == '0' {
            break
        }
        
        for str, prod := range mulOperators(num[i:]){
            rhv, _ := strconv.Atoi(num[0:i])
            ans[num[0:i]+"*"+str] = prod * rhv
        }
    }
    
    // 前置 0 无效
    if len(num) == 1 || num[0] != '0' {
        ans[num], _ = strconv.Atoi(num)
    }
    
    return ans
}

func addOperators(num string, target int) []string {
    var ans []string
    
    for i := 0; i < len(num); i++{
        // mulOperators 罗列出后续出现的项可能的组合
        for rhv, prod := range mulOperators(num[i:len(num)]){
            if prod == target && i == 0{
                ans = append(ans, rhv)
            } else if i != 0 {
                // target = lhv - rhv 的情况
                for _, lhv := range addOperators(num[0:i], prod+target) {
                    ans = append(ans, lhv + "-" + rhv)
                }
                
                // target = lhv + rhv 的情况
                for _, lhv := range addOperators(num[0:i], target-prod) {
                    ans = append(ans, lhv + "+" + rhv)
                }
            }
        }
    }
    
    return ans
}
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐