241. 为运算表达式设计优先级

为运算表达式设计优先级

题目描述:

给你一个由数字和运算符组成的字符串 expression ,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以 按任意顺序 返回答案。

生成的测试用例满足其对应输出值符合 32 位整数范围,不同结果的数量不超过 104 。

示例 1:

输入:expression = “2-1-1”
输出:[0,2]
解释:
((2-1)-1) = 0
(2-(1-1)) = 2
示例 2:

输入:expression = “23-45”
输出:[-34,-14,-10,-10,10]
解释:
(2*(3-(45))) = -34
((2
3)-(45)) = -14
((2
(3-4))5) = -10
(2
((3-4)5)) = -10
(((2
3)-4)*5) = 10

提示:

1 <= expression.length <= 20
expression 由数字和算符 ‘+’、’-‘ 和 ‘*’ 组成。
输入表达式中的所有整数值在范围 [0, 99]

思路:

时间复杂度:O(n^2),空间复杂度O(2^n)

分治应该是最简单和易于理解的方法了

代码:



func diffWaysToCompute(expression string) (res []int) {
    if isDigit(expression){
        tmp,_ := strconv.Atoi(expression)
        return []int{tmp}
    }
    for index,c := range expression{
        if c == '+' || c == '-' || c == '*'{
            left := diffWaysToCompute(expression[:index])
            right := diffWaysToCompute(expression[index+1:])
            for _,l := range left{
                for _,r := range right{
                    if c == '+'{
                        res = append(res, l+r)
                    }
                    if c== '-'{
                        res = append(res, l-r)
                    }
                    if c == '*'{
                        res = append(res, l*r)
                    }
                }
            }
        }
    }
    return res
}

// 判断是否为全数字
func isDigit(input string) bool {
    _, err := strconv.Atoi(input)
    if err != nil {
        return false
    }
    return true
}

代码效率:

执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2.2 MB, 在所有 Go 提交中击败了31.96%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!