LeetCode 每日一题笔记 日期:2026.05.21 题目:3043. 最长公共前缀的长度

LeetCode 每日一题笔记

0. 前言

  • 日期:2026.05.21
  • 题目:3043. 最长公共前缀的长度
  • 难度:中等
  • 标签:数组、字典树(Trie)、哈希表

1. 题目理解

问题描述 :

给定两个正整数数组 arr1 和 arr2,找出所有 (x,y) 数对(x 来自 arr1,y 来自 arr2)中,最长公共前缀的长度。如果不存在公共前缀,返回 0。

示例:

输入:arr1 = [1,10,100], arr2 = [1000]

输出:3

解释:(100, 1000) 的公共前缀是 100,长度为3,是所有数对中最长的。

2. 解题思路

核心观察

  • 公共前缀的本质是数字高位的共同部分,因此可以用**字典树(Trie)**存储一个数组的所有数字前缀,再遍历另一个数组查询最长匹配长度;
  • 也可以用哈希表存储 arr1 所有数字的前缀,再查询 arr2 的数字前缀是否存在,取最长长度。

算法步骤(哈希表法)

  1. 遍历 arr1,将每个数字的所有前缀存入哈希表;
  2. 遍历 arr2,对每个数字,依次取其前缀并检查是否在哈希表中;
  3. 记录匹配到的最长前缀长度。

3. 代码实现

java 复制代码
package lc3043;

import java.util.HashSet;

class Solution {
    public int longestCommonPrefix(int[] arr1, int[] arr2) {
        int res = 0;
        HashSet<Integer> set = new HashSet<>();
        for (int num : arr1) {
            while (num >= 10) {
                set.add(num);
                num /= 10;
            }
            set.add(num);
        }
        for (int num : arr2) {
            while (num >= 10) {
                if (set.contains(num)) {
                    res = Math.max(res, Integer.toString(num).length());
                }
                num /= 10;
            }
            if (set.contains(num)) {
                res = Math.max(res, 1);
            }
        }
        return res;
    }
}

4. 代码优化说明

减少冗余判断,统一处理单数字前缀的匹配逻辑,避免重复分支:

java 复制代码
package lc3043;

import java.util.HashSet;

class Solution {
    public int longestCommonPrefix(int[] arr1, int[] arr2) {
        HashSet<Integer> set = new HashSet<>();
        for (int num : arr1) {
            int n = num;
            while (n > 0) {
                set.add(n);
                n /= 10;
            }
        }
        
        int maxLen = 0;
        for (int num : arr2) {
            int n = num;
            while (n > 0) {
                if (set.contains(n)) {
                    maxLen = Math.max(maxLen, String.valueOf(n).length());
                    break;
                }
                n /= 10;
            }
        }
        return maxLen;
    }
}

5. 复杂度分析

  • 时间复杂度 :O(N×D+M×D)O(N \times D + M \times D)O(N×D+M×D),其中 NNN、MMM 为两个数组长度,DDD 为数字的最大位数(最多10位,可视为常数)。
  • 空间复杂度 :O(N×D)O(N \times D)O(N×D),哈希表存储所有前缀的空间开销。

6. 总结

  • 核心思路:前缀存储 + 匹配查询,哈希表法实现简单,字典树法在大数据下效率更高;
  • 优化后代码统一了单数字前缀的处理逻辑,减少了冗余分支,可读性更强;
  • 关键技巧:通过 num /= 10 循环剥离数字前缀,避免字符串转换的额外开销。
相关推荐
一只大鸽子18 分钟前
游戏开发笔记4-像素画基础 轮廓-直线和曲线
笔记
forest_0942 分钟前
多 Agent 协作第二课:交叉验证≠独立验证
人工智能·python·算法·机器学习·prompt·agi
小杨小杨、努力变强!1 小时前
python学习笔记
笔记·学习
纪念 2292 小时前
C++ 算法基础 (差分)
开发语言·c++·算法
杨逢昌工厂6S管理4 小时前
150-杨逢昌一线现场诊断笔记:越管一线越抵触背后的熵增机理与基准化治理
经验分享·笔记·职场和发展·学习方法
文丑颜不良啊4 小时前
LeetCode2761~2780题目解析
java·leetcode
jyOverQ5 小时前
从零学 JVM(六):垃圾回收算法详解——标记清除、标记复制与标记整理
jvm·算法
Star(up up up)6 小时前
Redis Windows 安装教程:使用Windows 的 Redis 压缩包
redis·笔记·学习·程序人生·云原生·学习方法·改行学it
严肃小白兔7 小时前
第 06/24 期:神经网络的反向传播算法:从链式法则到梯度计算
人工智能·神经网络·算法
希和20277 小时前
江科大 51 单片机课程笔记:DS1302 实时时钟 + LCD1602 可调电子钟(小白逐行讲解)
笔记·单片机·嵌入式硬件