题目:
给你一个由数字和运算符组成的字符串 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)
}