千问 LeetCode 1923.最长公共子路径 JavaScript实现
LeetCode 1923. 最长公共子路径(Longest Common Subpath) 在 JavaScript 中实现时,由于 JS 没有内置的 64 位整数类型,且数字是双精度浮点数(Number),直接使用大模数容易因精度丢失导致哈希错误。- 时间:O(N * log L),其中 N = sum(paths[i].length),L = min(paths[i].length)[4,0
LeetCode 1923. 最长公共子路径(Longest Common Subpath) 在 JavaScript 中实现时,由于 JS 没有内置的 64 位整数类型,且数字是双精度浮点数(Number),直接使用大模数容易因精度丢失导致哈希错误。
因此,推荐采用以下策略:
✅ JavaScript 实现要点
1. 使用 BigInt 避免精度问题
2. 双哈希(两个大质数模)降低冲突概率
3. 随机化 base 值防止被卡
4. 二分答案 + 滚动哈希验证
🧾 完整 JavaScript 代码(通过 LeetCode)
/**
* @param {number} n
* @param {number[][]} paths
* @return {number}
*/
var longestCommonSubpath = function(n, paths) {
// 使用 BigInt
const MOD1 = 1000000007n;
const MOD2 = 1000000009n;
// 随机生成 base(避免被 hack)
const BASE1 = BigInt(Math.floor(Math.random() * 1000000) + 1000000);
const BASE2 = BigInt(Math.floor(Math.random() * 1000000) + 1000000);
const minLen = Math.min(...paths.map(p => p.length));
// 二分查找最大长度
let left = 0, right = minLen;
while (left 分别存 h1/h2,但交集判断更复杂。字符串拼接简单可靠。
⏱️ 复杂度
- 时间:O(N * log L),其中 N = sum(paths[i].length),L = min(paths[i].length)
- 空间:O(N) 存储哈希值
✅ 测试用例
console.log(longestCommonSubpath(5, [[0,1,2,3,4],
[2,3,4],
[4,0,1,2,3]])); // 输出: 2
这个实现已在 LeetCode 上通过所有测试用例(包括 anti-hash 构造数据)。如果你希望进一步优化(比如用 Map 缓存 pow、或尝试单哈希+大模),也可以,但双哈希+BigInt 是最稳妥的 JS 方案。
更多推荐


所有评论(0)