【LeetCode每日一题】14. 最长公共前缀

题目

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。

示例 1

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

示例 2

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

提示

1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

题解

🧐解析:这道题目相比不需要过多解释,寻找最长公共前缀,显然两个 for 循环逐一比较两个字符串,
主要涉及的字符串操作是:1. 字符串比较,2. 子字符串提取
⚡注意:从大多数计算机编程语言的角度来看,字符串和数组本质上是很像的,只不过字符串涉及的操作更多
所以,在进行比较的同时,一定要避免越界访问
🎨比较方式:

  1. 横向比较
    横向比较

  2. 纵向比较
    纵向比较

🧾参考程序:

class Solution {
	public String longestCommonPrefix(String[] strs){
     StringBuilder stringBuilder = new StringBuilder();
// 为防止越界访问,将字符串按长度排序
     Arrays.sort(strs, (o1, o2) -> o1.length() > o2.length() ? 1 : -1);
// 纵向比较
     for (int i=0; i<strs[0].length(); ++i){
       char word = strs[0].charAt(i);
       for (int j=1; j<strs.length; ++j){
         if (strs[j].charAt(i) != word){
           return stringBuilder.toString();
         }
       }
       stringBuilder.append(word);
     }
     return stringBuilder.toString();
  }
}
class Solution {
  public String longestCommonPrefix2(String[] strs) {
// strs 指向 null,或 strs 数组为空
    if (strs == null || strs.length == 0){
      return "";
    }
    char[] Prefix = strs[0].toCharArray();
// prefixCount 最长公共前缀的长度
    int prefixCount = Prefix.length;
// 纵向比较
    for (int i=0; i<prefixCount; ++i){
      for (int j=0; j<strs.length; ++j){
// 预防 String 字符访问越界
        if (strs[j].length()-1 < i){
// 更新最长公共前缀长度
          prefixCount = i;
          break;
        }
        if (Prefix[i] != strs[j].charAt(i)){
// 更新最长公共前缀长度
          prefixCount = i;
          break;
        }
      }
    }
    return new String(Prefix, 0, prefixCount);
  }
}
class Solution {
  public String longestCommonPrefix3(String[] strs) {
    if (strs == null || strs.length == 0){
      return "";
    }
    String prefix = strs[0];
// 横向比较
    for (String s : strs) {
// 这个操作很巧妙的避免越界访问错误
      if (prefix.startsWith(s)) {
        prefix = s;
        continue;
      }
      for (int i = 0; i < prefix.length(); i++) {
        if (s.charAt(i) != prefix.charAt(i)) {
// 每次比较更新最长公共前缀
          prefix = new String(prefix.substring(0, i));
          break;
        }
      }
    }
    return prefix;
  }
}

复杂度分析

(参考程序1:时间复杂度由于排序操作,时间复杂度要更大,由于引入了 StringBuilder,因此也增加了空间复杂度)
⏱时间复杂度:O(nm),其中 n 是字符串数组的长度,m 是字符串长度
💿空间复杂度:O(1),并未引用额外的辅助空间


原题链接:https://leetcode-cn.com/problems/longest-common-prefix

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

!flameking

你的鼓励和支持将是我永远的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值