From 60cb9ae2e30dbb2b1f6910d9f1c25122e6e06a78 Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Tue, 24 Sep 2024 23:11:59 +0200 Subject: [PATCH] =?UTF-8?q?go:=20add=20=C2=AB3043.=20Find=20the=20Length?= =?UTF-8?q?=20of=20the=20Longest=20Common=20Prefix=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- ...the-length-of-the-longest-common-prefix.go | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 go/find-the-length-of-the-longest-common-prefix.go diff --git a/go/find-the-length-of-the-longest-common-prefix.go b/go/find-the-length-of-the-longest-common-prefix.go new file mode 100644 index 0000000..67db254 --- /dev/null +++ b/go/find-the-length-of-the-longest-common-prefix.go @@ -0,0 +1,42 @@ +package main + +import "strconv" + +type LCPTrieNode struct { + children [10]*LCPTrieNode + has [2]bool +} + +func longestCommonPrefix(arr1 []int, arr2 []int) int { + update := func(node *LCPTrieNode, number string, index int) int { + best := 0 + for i := range number { + child := number[i] - '0' + if node.children[child] == nil { + node.children[child] = &LCPTrieNode{} + } + node = node.children[child] + node.has[index] = true + + if node.has[index] && node.has[(index+1)%2] { + best = i + 1 + } + } + + return best + } + + root := LCPTrieNode{} + for _, num := range arr1 { + strnum := strconv.Itoa(num) + update(&root, strnum, 0) + } + + longest := 0 + for _, num := range arr2 { + strnum := strconv.Itoa(num) + longest = max(longest, update(&root, strnum, 1)) + } + + return longest +}