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

JAVA练习371- 最长公共前缀

题目概览

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串""

示例 1:

输入:strs = ["flower","flow","flight"] 输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i]如果非空,则仅由小写英文字母组成

来源:14. 最长公共前缀 - 力扣(LeetCode)

解题分析

方法一:纵向遍历

纵向遍历是最直观的解法。从每个字符串的第一个字符开始,依次比较同一列上的字符是否相同。

算法步骤:

  1. 以第一个字符串strs[0]为基准,遍历其每个字符(索引j)。
  2. 对于每个索引j,遍历数组中其余字符串(strs[1]strs[n-1])。
  3. 如果遇到以下情况之一,则停止遍历并返回结果:
    • 当前字符串strs[i]的长度小于等于j(即该字符串已到末尾)。
    • 当前字符串在索引j处的字符与基准字符串strs[0]在索引j处的字符不同。
  4. 如果遍历完基准字符串的所有字符都未遇到不匹配,则整个基准字符串就是最长公共前缀。

复杂度分析:

  • 时间复杂度:O(m×n),其中 m 是字符串的平均长度,n 是字符串数组的长度。最坏情况下需要比较所有字符。
  • 空间复杂度:O(1),只使用了常数级别的额外空间。
class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0) { return ""; } // 以第一个字符串为基准 for (int j = 0; j < strs[0].length(); j++) { char c = strs[0].charAt(j); // 遍历其余字符串 for (int i = 1; i < strs.length; i++) { // 如果当前字符串长度不足或字符不匹配 if (j >= strs[i].length() || strs[i].charAt(j) != c) { return strs[0].substring(0, j); } } } // 第一个字符串本身就是最长公共前缀 return strs[0]; } }

方法二:横向扫描

横向扫描是另一种常见思路:依次将每个字符串与当前得到的前缀进行比较,并更新前缀。

算法步骤:

  1. 将第一个字符串strs[0]作为初始前缀prefix
  2. 遍历数组中的每个字符串strs[i](从第二个开始):
    • 比较prefixstrs[i],找出它们的最长公共前缀。
    • prefix更新为这个新的前缀。
    • 如果prefix变为空字符串,则提前返回""
  3. 遍历结束后,prefix即为最长公共前缀。

复杂度分析:

  • 时间复杂度:O(m×n),其中 m 是字符串的平均长度,n 是字符串数组的长度。
  • 空间复杂度:O(m),需要存储当前前缀。
class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0) { return ""; } String prefix = strs[0]; for (int i = 1; i < strs.length; i++) { // 找出 prefix 与当前字符串的公共前缀 while (strs[i].indexOf(prefix) != 0) { prefix = prefix.substring(0, prefix.length() - 1); if (prefix.isEmpty()) { return ""; } } } return prefix; } }

方法三:分治法

将问题分解为子问题:数组的最长公共前缀 = 左半部分的最长公共前缀 与 右半部分的最长公共前缀 的公共前缀。

算法步骤:

  1. 将字符串数组分成左右两半。
  2. 递归求出左半部分的最长公共前缀leftPrefix
  3. 递归求出右半部分的最长公共前缀rightPrefix
  4. 返回leftPrefixrightPrefix的公共前缀。
  5. 递归的基准情况:当区间只有一个字符串时,直接返回该字符串。

复杂度分析:

  • 时间复杂度:O(m×n),与纵向遍历相同,但递归调用会带来额外的开销。
  • 空间复杂度:O(m×log n),递归深度为 log n,每层需要存储中间结果。
class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0) { return ""; } return divide(strs, 0, strs.length - 1); } private String divide(String[] strs, int left, int right) { if (left == right) { return strs[left]; } int mid = left + (right - left) / 2; String leftPrefix = divide(strs, left, mid); String rightPrefix = divide(strs, mid + 1, right); return commonPrefix(leftPrefix, rightPrefix); } private String commonPrefix(String str1, String str2) { int minLen = Math.min(str1.length(), str2.length()); for (int i = 0; i < minLen; i++) { if (str1.charAt(i) != str2.charAt(i)) { return str1.substring(0, i); } } return str1.substring(0, minLen); } }

方法对比与总结

方法思路时间复杂度空间复杂度适用场景
纵向遍历逐列比较字符O(m×n)O(1)最直观,代码简洁,内存占用少
横向扫描依次与前缀比较并更新O(m×n)O(m)易于理解,适合字符串长度差异大的情况
分治法递归分解问题O(m×n)O(m×log n)适合并行计算或作为算法练习

推荐:在实际面试或编程中,纵向遍历是最常用且高效的解法,代码简洁,空间复杂度最优。

边界情况处理:

  • 输入数组为空或为null:直接返回空字符串。
  • 数组中包含空字符串:公共前缀必然为空。
  • 所有字符串完全相同:返回任意一个字符串。
http://www.jsqmd.com/news/1295517/

相关文章:

  • neo4j的国内可用镜像站
  • 呼和浩特会议活动跟拍摄影摄像综合服务力评测:活动跟拍会议拍摄乳业活动摄影草原节庆摄像照片直播视频直播展会跟拍多机位摄像活动快剪乳博会跟拍团建航拍高清照片精修大型草原活动云摄影快剪 - 狩猎者007
  • AI 写完了订单取消功能,上线后才发现漏了四条业务规则
  • HExHTTP高级技巧:Burp Suite集成与漏洞报告生成指南
  • 知识城家装装修公司推荐:【派福装饰】温馨筑居 - 17728181569
  • 端侧 AI 芯片新突破:3D 近存计算芯片亮相,把大模型“装进“设备本地
  • 三步掌握MindYOLO:华为MindSpore目标检测实战指南
  • 如何快速集成React Native Google Cast?从安装到第一个投屏功能的完整指南
  • 法索AI,凭什么用一年时间,走上世界人工智能大会? - 生活动态圈
  • 2026年合肥装修公司挑选攻略:云构装饰等正规装企实测梳理 - 比奇堡111
  • Windows上直接运行安卓应用:APK安装器完整指南
  • 3分钟解锁网易云音乐隐藏功能:BetterNCM插件管理器完整指南
  • 游戏运营和游戏策划的区别?从目标、流程和数据口径对比
  • 2026年挑河南质量好的水处理消毒设备工厂看这篇 - 品牌优推
  • 终极编程字体指南:为什么Maple Mono是开发者的最佳选择
  • 为什么要学 Python?先看懂用途,再高效入门编程
  • QQ空间历史数据抓取终极指南:GetQzonehistory架构设计与工程实践
  • 2026上海莫奈轻奢包包回收全解!网红款行情波动分析,收的顶透明交易无套路 - 奢侈品回收评测
  • application-gateway-kubernetes-ingress终极教程:解锁Azure Application Gateway与AKS的无缝集成
  • 泉盛UV-K5/K6终极升级指南:解锁专业级对讲机固件功能
  • 离线还是云端?人脸识别方案选型终极指南——三大厂商实测对比,看完不再纠结
  • 北京密云爱马仕入门款回收行情,新手出手避坑经验分享 - 生活时报
  • 2026英国专线物流渠道差异详解:不同货量、时效场景怎么选? - 互联网科技品牌测评
  • B站视频下载神器:轻松获取大会员4K高清资源的完整指南
  • Flank完全指南:Firebase Test Lab的终极Android与iOS并行测试工具
  • 2026年南京口碑好的单轴撕碎机刀片制造厂家:适配广泛,互换性强 - 卓企推荐
  • 安徽省武校值得去吗?家长真实反馈及择校经验分享,文武双修特色课程及升学通道介绍 - 圣龙武术朱老师
  • 东莞AI推广GEO优化公司推荐:别被纯技术派忽悠,本地化流量要抓这三点 - 变量人生001
  • Space Thumbnails:如何在Windows资源管理器中为3D模型文件生成精美缩略图?
  • 告别风扇噪音!Fan Control让你的Windows电脑真正安静下来