From 9b3e3e9ee4b59a4a5a9f9274915732fc8787e76f Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Fri, 20 Sep 2024 00:05:10 +0200 Subject: [PATCH] =?UTF-8?q?go:=20add=20=C2=AB241.=20Different=20Ways=20to?= =?UTF-8?q?=20Add=20Parentheses=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- go/different-ways-to-add-parentheses.go | 66 +++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 go/different-ways-to-add-parentheses.go diff --git a/go/different-ways-to-add-parentheses.go b/go/different-ways-to-add-parentheses.go new file mode 100644 index 0000000..cb12010 --- /dev/null +++ b/go/different-ways-to-add-parentheses.go @@ -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] +}