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

101 阅读1分钟

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

解法:
这个题关键在于抓住运算符号左右两边分别返回[]int,对两个[]int数组元素进行运算。 方法一:分治


import "strconv"
func diffWaysToCompute(expression string) []int {
	ret := make([]int, 0)
	for i := range expression {
		if expression[i] == '+' || expression[i] == '-' || expression[i] == '*' {
			left := diffWaysToCompute(expression[:i])
			right := diffWaysToCompute(expression[i + 1:])
			for _, l := range left{
				for _, r := range right {
					switch expression[i] {
					case '+':
						ret = append(ret, l + r)
					case '-':
						ret = append(ret, l - r)
					case '*':	
						ret = append(ret, l * r)
					}
				
				}
			}
		}
	}
	if len(ret) == 0 {
		n, _ := strconv.Atoi(expression)
		ret = append(ret, n)
	}
	return ret
}

方法二:分治+记忆化

import "strconv"
func diffWaysToCompute(expression string) []int {
	memory := make(map[string][]int)
	var dfs func(str string) []int 
	dfs = func(str string) []int {
		num, err := strconv.Atoi(str)
		if err == nil {
			return []int{num}
		}
		if m, ok := memory[str]; ok {
			return m
		}
		ret := make([]int, 0)
		for i := range str {
			if str[i] == '+' || str[i] == '-' || str[i] == '*' {
				left := dfs(str[:i])
				right := dfs(str[i + 1:])
				for _, ln := range left {
					for _, rn := range right {
						switch str[i] {
						case '+': ret = append(ret, ln + rn)
						case '-': ret = append(ret, ln - rn)
						case '*': ret = append(ret, ln * rn)
						}
						
					}
				}
			} 
		}
		memory[str] = ret
		return ret
	}
	
	return dfs(expression)
}