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

许昌网站建设公司番禺俊才网

许昌网站建设公司,番禺俊才网,网站建设的计划,东莞信科做网站力扣14. 最长公共前缀:Java四种解法详解 题目描述 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例: 输入:strs ["flower","flow","flight&quo…

力扣14. 最长公共前缀:Java四种解法详解

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""
示例
输入:strs = ["flower","flow","flight"] → 输出:"fl"
输入:strs = ["dog","racecar","car"] → 输出:""


解法一:横向扫描(逐步缩小前缀)

代码实现

public 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++) {int j = 0;while (j < prefix.length() && j < strs[i].length() && prefix.charAt(j) == strs[i].charAt(j)) {j++;}prefix = prefix.substring(0, j);if (prefix.isEmpty()) break;}return prefix;}
}

复杂度分析

  • 时间复杂度:O(mn),其中 m 是字符串平均长度,n 是数组长度。最坏情况下每个字符串都需完全比较。
  • 空间复杂度:O(1),仅需常数空间存储中间变量。

核心思路

以第一个字符串为初始前缀,依次与其他字符串逐字符比较,逐步缩小前缀范围。若中途前缀为空,则提前终止。


解法二:纵向扫描(逐列比较)

代码实现

public class Solution {public String longestCommonPrefix(String[] strs) {if (strs == null || strs.length == 0) return "";for (int i = 0; i < strs[0].length(); i++) {char c = strs[0].charAt(i);for (int j = 1; j < strs.length; j++) {if (i >= strs[j].length() || strs[j].charAt(i) != c) {return strs[0].substring(0, i);}}}return strs[0];}
}

复杂度分析

  • 时间复杂度:O(mn),逐列比较所有字符串的每个字符。
  • 空间复杂度:O(1),无需额外存储。

核心思路

从第一个字符开始,依次比较所有字符串的同一列字符,直到某一列不匹配,返回当前列之前的子串。


解法三:排序后首尾比较

代码实现

import java.util.Arrays;public class Solution {public String longestCommonPrefix(String[] strs) {if (strs == null || strs.length == 0) return "";Arrays.sort(strs);String first = strs[0], last = strs[strs.length - 1];int minLen = Math.min(first.length(), last.length());int i = 0;while (i < minLen && first.charAt(i) == last.charAt(i)) {i++;}return first.substring(0, i);}
}

复杂度分析

  • 时间复杂度:O(n log n + m),排序耗时 O(n log n),比较首尾字符串耗时 O(m)
  • 空间复杂度:O(log n),排序的栈空间开销。

核心思路

排序后,最长公共前缀只需比较首尾字符串的公共部分。排序后首尾差异最大,因此公共前缀即全局公共前缀。


解法四:利用 startsWith 方法优化

代码实现

public class Solution {public String longestCommonPrefix(String[] strs) {if (strs == null || strs.length == 0) return "";String prefix = strs[0];for (String s : strs) {while (!s.startsWith(prefix)) {prefix = prefix.substring(0, prefix.length() - 1);if (prefix.isEmpty()) return "";}}return prefix;}
}

复杂度分析

  • 时间复杂度:O(mn),最坏情况下每个字符均需截取。
  • 空间复杂度:O(1),直接操作字符串。

核心思路

以第一个字符串为基准,逐步缩短前缀长度,直到所有字符串均以该前缀开头。利用 startsWith 简化字符比较逻辑。


各解法对比

解法优点缺点适用场景
横向扫描逻辑清晰,代码简洁需要频繁截取子串通用场景
纵向扫描直接比较,无额外操作对空字符串处理需谨慎字符串长度差异小的场景
排序后比较减少比较次数,代码高效排序可能引入额外时间开销字符串数量较少的场景
startsWith代码简洁,易读频繁截取可能影响性能快速实现需求

示例解析

以输入 ["flower", "flow", "flight"] 为例:

  1. 横向扫描
    • 初始前缀 "flower",与 "flow" 比较后缩小为 "flow"
    • 再与 "flight" 比较,最终得到 "fl"
  2. 纵向扫描
    • 比较所有字符串的第0列字符 f,第1列字符 l,第2列字符 oi 不匹配,返回前两列 "fl"

总结

以上四种方法均可高效解决问题,推荐根据场景选择:

  • 纵向扫描:适用于字符串长度差异较小的场景,直接逐列比较效率高。
  • 排序法:若字符串数量较少,排序后首尾比较更高效。
  • startsWith:适合快速实现,代码简洁但需注意性能。

可直接复制代码到力扣运行,保证通过!


欢迎在评论区留言讨论其他优化思路或问题!

http://www.dtcms.com/a/518812.html

相关文章:

  • 顶尖手机网站建设微信小程序源码网站
  • 长沙旅游网站制作东莞设计展
  • 食品网站app建设方案为wordpress开发app
  • 肇庆建站模板源码长春网站优化教程
  • 培训班该如何建站建立搜索引擎网站
  • 如何建自己网站做淘宝客兰州手机网站制作公司
  • 企业网站页面网站维护能自己做吗
  • 龙岗网站制作效果wordpress在线演示
  • 无网站如何做淘宝客网站开发的历史
  • 做电影网站如何规避版权艺术设计与制作
  • 网站一年的 运营费用php是做网站还是网页
  • 宝安的医院网站建设买国外空间哪个网站好
  • 怎样查看网站开发门户网站分类
  • 萧山建设信用网自学网站建设和seo
  • 建设银行重庆分行网站建设工程公司是干嘛的
  • 网站建设万禾重庆最新消息数据
  • 杭州钱塘区网站建设政务公开和网站建设
  • 网站负责人 备案咨询公司排名前十
  • 购物网站 app湛江做网站设计公司
  • 档案网站建设对比网站建设技术简易留言板
  • 什么网站可以查建设用地规划许可证vs网站怎么做
  • 做网站网页文件电子商务网站设计说明
  • 江苏建设通网站网站后台管理系统 英文
  • 巩义网站建设案例课堂网站主机与服务器吗
  • 看房子建设进度的网站中国男女做网站
  • 莱芜高端网站建设价格屏边县住房和城乡建设局网站
  • 纯手工建网站网页封装网站怎么做的接口
  • 彩票网站 建设wordpress 关闭更新警告
  • 做cpa项目用什么网站网站开发与维护的工资
  • 公司网站建设 做账浙江广厦建设职业技术学院网站