Bootstrap

【力扣高频题】014.最长公共前缀

经常刷算法题的小伙伴对于 “最长”,“公共” 两个词一定不陌生。与此相关的算法题目实在是太多了 !!!

之前的 「动态规划」 专题系列文章中就曾讲解过两道相关的题目:最长公共子序列最长回文子序列

关注公众号,在 主页合集 中可以查看更多相关文章。


今天我们继续来学习一道较为简单的 “最长公共” 问题。

14. 最长公共前缀

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

示例 1:

输入: strs = [“flower”,“flow”,“flight”]

输出: “fl”

示例 2:

输入: strs = [“dog”,“racecar”,“car”]

输出: “”

解释: 输入不存在公共前缀。

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

思路分析

这道题的处理办法有很多:横向对比、纵向对比、字典树、分治、二分查找 等等(能想到后两种方法的一定不是一般人哈哈哈)。

这里采用最简单,也是最容易想到的方法 —— 横向对比 ,即直接两两依次对比。

横向对比 :

  1. 将字符串数组中的 第一个 字符串元素做为 基准元素

  2. 依次遍历字符串数组,将数组中的每个字符串都与 基准元素作对比 ,求出此时的字符串与基准元素的最长公共前缀的下标。

  3. 取所有下标的最小值,即为最长公共前缀的长度。

代码

public static String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) {
        return "";
    }
    char[] chs = strs[0].toCharArray();
    int min = Integer.MAX_VALUE;
    for (String str : strs) {
        char[] tmp = str.toCharArray();
        int index = 0;
        while (index < tmp.length && index < chs.length) {
            if (chs[index] != tmp[index]) {
                break;
            }
            index++;
        }
        min = Math.min(index, min);
        // min 已经为 0 了,可提前结束
        if (min == 0) {
            return "";
        }
    }
    return strs[0].substring(0, min);
}

代码解释

  1. 注意边界条件的判断:若字符串数组本身为空或其长度为 0 ,可直接返回 空串
  2. 若在遍历过程中,最长公共前缀的长度最小值已经为 0 了,则说明答案一定为空串,可以提前结束,直接返回。

前面的算法文章,更新了许多 专题系列 。包括:滑动窗口、动态规划、加强堆、二叉树递归套路 等。

接下来的一段时间,将持续 「力扣高频题」 系列文章,想刷 力扣高频题 的小伙伴可以关注一波哦 ~

~ 点赞 ~ 关注 ~ 星标 ~ 不迷路 ~!!!

回复「ACM紫书」获取 ACM 算法书籍 ~
回复「算法导论」获取 算法导论第3版 ~

在看 + 转发

让你的小伙伴们一起来学算法吧!!

;