From 34b86138ef9e3f96314e49b69178d9d128898827 Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Wed, 21 Aug 2024 12:51:31 +0200 Subject: [PATCH] =?UTF-8?q?go:=20add=20=C2=AB664.=20Strange=20Printer?= =?UTF-8?q?=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- go/strange-printer.go | 57 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 go/strange-printer.go diff --git a/go/strange-printer.go b/go/strange-printer.go new file mode 100644 index 0000000..0dd6953 --- /dev/null +++ b/go/strange-printer.go @@ -0,0 +1,57 @@ +package main + +import "strings" + +func strangePrinter(s string) int { + mergeConsecutive := func() string { + withoutConsecutive := strings.Builder{} + + for i := 0; i < len(s); { + c := s[i] + withoutConsecutive.WriteByte(c) + + for i < len(s) && s[i] == c { + i++ + } + } + + return withoutConsecutive.String() + } + + compute := func(s string, dp [][]int, length int) { + for l := 0; l+length-1 < len(s); l++ { + r := l + length - 1 + + dp[l][r] = length + + for mid := 0; mid < length-1; mid++ { + turns := dp[l][l+mid] + dp[l+mid+1][r] + + if s[l+mid] == s[r] { + turns-- + } + + dp[l][r] = min( + dp[l][r], + turns, + ) + } + } + } + + s = mergeConsecutive() + n := len(s) + + // Make a DP table + dp := make([][]int, n) + for i := range n { + dp[i] = make([]int, n) + dp[i][i] = 1 + } + + for length := 2; length <= n; length++ { + compute(s, dp, length) + } + + return dp[0][n-1] +}