go: add «241. Different Ways to Add Parentheses»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
40da3403da
commit
9b3e3e9ee4
1 changed files with 66 additions and 0 deletions
66
go/different-ways-to-add-parentheses.go
Normal file
66
go/different-ways-to-add-parentheses.go
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unicode"
|
||||||
|
)
|
||||||
|
|
||||||
|
func diffWaysToCompute(expression string) []int {
|
||||||
|
n := len(expression)
|
||||||
|
dp := make([][][]int, n)
|
||||||
|
for i := range dp {
|
||||||
|
dp[i] = make([][]int, n)
|
||||||
|
}
|
||||||
|
|
||||||
|
computeBase := func() {
|
||||||
|
for i, c := range expression {
|
||||||
|
if !unicode.IsDigit(c) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
digit := int(c - '0')
|
||||||
|
dp[i][i] = append(dp[i][i], digit)
|
||||||
|
|
||||||
|
if i+1 < n && unicode.IsDigit(rune(expression[i+1])) {
|
||||||
|
nextDigit := int(expression[i+1] - '0')
|
||||||
|
dp[i][i+1] = append(dp[i][i+1], digit*10+nextDigit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
computeBase()
|
||||||
|
|
||||||
|
precompute := func(op byte, left, right, results []int) []int {
|
||||||
|
for _, l := range left {
|
||||||
|
for _, r := range right {
|
||||||
|
switch op {
|
||||||
|
case '+':
|
||||||
|
results = append(results, l+r)
|
||||||
|
case '-':
|
||||||
|
results = append(results, l-r)
|
||||||
|
case '*':
|
||||||
|
results = append(results, l*r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
computeSubexpression := func(l, r int) {
|
||||||
|
for mid := l; mid <= r; mid++ {
|
||||||
|
if unicode.IsDigit(rune(expression[mid])) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
left, right := dp[l][mid-1], dp[mid+1][r]
|
||||||
|
dp[l][r] = precompute(expression[mid], left, right, dp[l][r])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for length := 3; length <= n; length++ {
|
||||||
|
for l := 0; l+length-1 < n; l++ {
|
||||||
|
r := l + length - 1
|
||||||
|
computeSubexpression(l, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dp[0][n-1]
|
||||||
|
}
|
Loading…
Reference in a new issue