3043 最长公共前缀的长度-中等

题目:

给你两个 正整数 数组 arr1arr2

正整数的 前缀 是其 最左边 的一位或多位数字组成的整数。例如,123 是整数 12345 的前缀,而 234 不是

设若整数 c 是整数 ab公共前缀 ,那么 c 需要同时是 ab 的前缀。例如,565535956554 有公共前缀 565 ,而 122343456 没有 公共前缀。

你需要找出属于 arr1 的整数 x 和属于 arr2 的整数 y 组成的所有数对 (x, y) 之中最长的公共前缀的长度。

返回所有数对之中最长公共前缀的长度。如果它们之间不存在公共前缀,则返回 0

示例 1:

输入:arr1 = [1,10,100], arr2 = [1000]
输出:3
解释:存在 3 个数对 (arr1[i], arr2[j]) :
- (1, 1000) 的最长公共前缀是 1 。
- (10, 1000) 的最长公共前缀是 10 。
- (100, 1000) 的最长公共前缀是 100 。
最长的公共前缀是 100 ,长度为 3 。

示例 2:

输入:arr1 = [1,2,3], arr2 = [4,4,4]
输出:0
解释:任何数对 (arr1[i], arr2[j]) 之中都不存在公共前缀,因此返回 0 。
请注意,同一个数组内元素之间的公共前缀不在考虑范围内。

解题思路

将其中一个数组进行字典树构建,然后后另一个数组在字典树进行查找,并找到最长的公共前缀长度。

// date 2024/03/31
type Trie struct {
	child [10]*Trie
}

func NewTrie() *Trie {
	return &Trie{child: [10]*Trie{}}
}

func (this *Trie) insert(num string) {
	cur := this
	n := len(num)
	for i := 0; i < n; i++ {
		idx := num[i] - '0'
		if cur.child[idx] == nil {
			cur.child[idx] = NewTrie()
		}
		cur = cur.child[idx]
	}
}

func (this *Trie) searchPrefix(prefix string) int {
	cur := this
	n := len(prefix)
	ans := 0
	for i := 0; i < n; i++ {
		idx := prefix[i] - '0'
		if cur.child[idx] != nil {
			cur = cur.child[idx]
			ans++
		} else {
			break
		}
	}
	return ans
}

func longestCommonPrefix(arr1 []int, arr2 []int) int {
	tie := NewTrie()
	ans := 0

	for _, v := range arr1 {
		tie.insert(fmt.Sprintf("%d", v))
	}
	for _, v := range arr2 {
		temp := tie.searchPrefix(fmt.Sprintf("%d", v))
		ans = max(ans, temp)
	}

	return ans
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

最后更新于