当前位置: 首页 > news >正文

A.每日一题:3043. 最长公共前缀的长度

题目链接:3043. 最长公共前缀的长度(中等)

算法原理:

如果采用暴力解法,遍历arr1的每个数,再遍历arr2的每个数,再去挨个用s.substring()去匹配,那么时间复杂度会飙升到O(NML)的级别,其中L=max(arr1中数的最大长度,arr2中数的最大长度),在此题的数据范围下必然会导致超时

解法一:字符串+哈希表

267ms击败5.55%

时间复杂度O(L×(M+N)),L是常数

我们可以分别把arr1和arr2中各个数的前缀转成字符串存进哈希表中,由于我们仅需找到所有arr1和arr2两两配对的最大前缀长度,因此我们存哈希表的过程中无需存出现次数,所以我们可以使用Set来存,这样的话能够将复杂度从O(NML)降到O(NL)

①分别处理arr1和arr2中的每个数

通过s.substring()来获取该数字的前缀(注意截取范围是[),因此写成s.substring(0,i+1))

将该前缀扔进Set

②遍历哈希表1的每个字符串s,判断哈希表2是否存在s,如果存在s且长度更长,就更新最大长度

优化

167ms击败36.11%

时间复杂度O(L×(M+N)),L是常数

我们也可以只使用一个哈希表完成上述过程,只处理arr1的所有数的前缀,遍历arr2时直接判断更新

解法二:整数处理+哈希表

65ms击败75.00%

时间复杂度O(L×(M+N)),L是常数

不断将元素x除以10,直到0,这个过程中的数即为x的前缀

比如123→12→1→0

代码实现时,不需要计算长度,而是直接取数值的最大值,因为数值越大,长度自然越长

JAVA代码:

class Solution { //3043. 最长公共前缀的长度 //解法一:字符串+哈希表 public int longestCommonPrefix(int[] arr1, int[] arr2) { Set<String> hash1=new HashSet<>(); Set<String> hash2=new HashSet<>(); for(int x:arr1){ String s=String.valueOf(x); for(int i=0;i<s.length();i++){ String pre=s.substring(0,i+1);//截取范围在[0,i+1) hash1.add(pre); } } for(int x:arr2){ String s=String.valueOf(x); for(int i=0;i<s.length();i++){ String pre=s.substring(0,i+1); hash2.add(pre); } } int ret=0; for(String s:hash1) if(hash2.contains(s)&&s.length()>ret) ret=s.length(); return ret; } }
class Solution { //3043. 最长公共前缀的长度 //解法一优化:字符串+哈希表 public int longestCommonPrefix(int[] arr1, int[] arr2) { Set<String> hash=new HashSet<>(); for(int x:arr1){ String s=String.valueOf(x); for(int i=0;i<s.length();i++) hash.add(s.substring(0,i+1)); } int ret=0; for(int x:arr2){ String s=String.valueOf(x); for(int i=0;i<s.length();i++){ if(!hash.contains(s.substring(0,i+1))) break; ret=Math.max(ret,i+1); } } return ret; } }
class Solution { //3043. 最长公共前缀的长度 //解法二:整数处理+哈希表 public int longestCommonPrefix(int[] arr1, int[] arr2) { Set<Integer> hash=new HashSet<>(); for(int x:arr1) for(;x>0;x/=10) hash.add(x); int mx=0; for(int x:arr2){ while(x>0&&!hash.contains(x)) x/=10; mx=Math.max(mx,x); } return mx>0?Integer.toString(mx).length():0; } }
http://www.jsqmd.com/news/857895/

相关文章:

  • Vue 3 + ESLint 9 代码规范配置指南
  • 对比按量计费与Token Plan套餐,哪种方式更适合长期稳定的项目
  • 新技能get--自动公众号和小红书种草
  • 码蹄集MC0519伏击桥下探情况
  • 收藏!小白也能看懂,AI Agent到底是个啥?它将如何改变你的工作与生活?
  • UE5自建HTTP网络模块:从蓝图黑盒到可控基础设施
  • 技术架构解析:APK Installer实现Windows系统直接运行Android应用的技术方案
  • 微信好友关系智能检测:3步找出谁已删除或拉黑你
  • 答辩 PPT 还在熬夜改?Paperxie 这套 AI 生成流程,让本科生从选题到定稿全程躺平
  • 如何利用DeepSeek-Coder-V2开源代码模型提升开发效率?
  • 终极Mac微信增强插件:防撤回与多开登录的完整解决方案
  • 3个核心技巧:用FanControl彻底解决Windows风扇噪音问题
  • 【Midjourney景深控制终极指南】:20年AI视觉工程师亲授f/1.2–f/16级物理光圈模拟技法
  • 使用Taotoken后模型API调用延迟与稳定性体感观察
  • ARM SVE指令集:SIMD技术进阶与性能优化实践
  • OpenHTMLtoPDF:现代Java应用中的HTML转PDF终极解决方案
  • Onekey Steam清单下载工具:轻松获取游戏清单的终极解决方案
  • 在Hermes Agent项目中集成Taotoken自定义模型提供方
  • 耗子拿枪了:AI如何把漏洞挖掘的门槛从“院士”拉低到“脚本小子”
  • 我用AI把公司10万行代码屎山重构了,CTO看了代码后说:你提前转正
  • 工程供应商管理软件怎么选?从准入评估、招标比价到结算评价的选型指南
  • CircuitJS1桌面版:三步实现专业级离线电路仿真
  • Photoshop图层批量导出插件:如何让设计效率提升90倍?
  • KMS_VL_ALL_AIO技术架构深度解析:Windows与Office激活引擎的设计哲学
  • 告别Spconv安装噩梦:用Docker一键搞定PyTorch 1.10 + CUDA 11.8下的环境配置
  • 3分钟掌握智慧职教刷课脚本:全平台自动学习解决方案
  • Scroll Reverser终极指南:3分钟彻底解决Mac滚动方向冲突难题
  • 2026最新大模型学习路线:从零基础到实战精通,少走2年弯路
  • 3分钟掌握TrafficMonitor插件:打造你的智能桌面监控中心
  • 高效解决PL2303兼容性问题:Windows 10/11专业级驱动配置实战指南