4710 字
约 15 分钟
1
014. 最长公共前缀
无标签

014. 最长公共前缀

作者:沉默王二 发布时间:2024-01-23T19:45:00.942+0800


鲁迅曾说,每天刷一道二哥的 LeetCode 笔记,不但身体健康,而且精神抖擞。

技术派阅读地址:https://paicoding.com/column/7/1 4

  • 语雀专栏地址+密码可通过星球置顶帖查看:https://t.zsxq.com/15rEo9Pdu

  • 这道题可以说完全重写了,给出2道大家完全都能掌握的题解(hashmap 和 数组)。

  • 增加代码注释,这样大家更容易看懂并掌握题解;

  • 增加参考资料,这样大家可以从零基础直接开刷,减轻新手刷题的阻力;

  • 增加手绘图,这样大家更容易理解解题思路;

  • 增加 ACM 输入输出,这样大家可以在 Intellij IDEA 中进行调试;

  • 增加题解模拟,这样大家可以根据题解模拟整个题解过程,看完会有一种“哦哦”恍然大悟的感觉;

  • 图片上传至 OSS 并配合 CDN,提升大家在技术派网站中的阅读体感。

  • 另外,这一版本会作为 PDF 的终稿随后在星球进行发布。

题意

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

难度

简单

示例

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

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

分析

这道题最重要的是,搞清楚什么是公共前缀。公共前缀就是字符串数组中,所有字符串都包含的前缀。例如,字符串数组 ["flower","flow","flight"] 的最长公共前缀就是 fl。

一个很容易想到的办法,我们将数组中的第一个字符串作为初始的最长公共前缀,然后逐个将它与数组中的其他字符串进行比较。在比较的过程中,我们逐步缩短这个公共前缀,直到它同时是所有字符串的前缀。

①、初始前缀:假设整个数组的最长公共前缀就是数组中的第一个字符串,即 prefix = strs[0]。

②、遍历字符串数组:遍历字符串数组中的每一个字符串。对于每个字符串 strs[i],我们检查它是否包含当前的最长公共前缀 prefix。(可以跳过第一个,因为第一个就是它自己)

③、更新前缀

  • 如果当前字符串 strs[i] 包含前缀 prefix,我们就继续下一个字符串的比较。
  • 如果当前字符串 strs[i] 不包含前缀 prefix,我们就缩短前缀的长度,即 prefix = prefix.substring(0, prefix.length () - 1),然后再次检查。
  • 重复这个过程,直到 strs[i] 包含了 prefix 或 prefix 变成空字符串(即没有公共前缀)。

④、返回结果:最终 prefix 就是数组中所有字符串的最长公共前缀。

我们来看题解:

class Solution {
    if (strs == null || strs.length == 0) {            return "";        }
    // 以第一个字符串作为初始的最长公共前缀        String prefix = strs[0];        for (int i = 1; i < strs.length; i++) {            while (strs[i].indexOf(prefix) != 0) {                // 如果当前字符串不包含当前最长公共前缀,则前缀长度减一                prefix = prefix.substring(0, prefix.length() - 1);                if (prefix.isEmpty()) {                    return "";                }            }        }        return prefix;    }}

假设输入的字符串数组是 ["flower","flow","flight"]。

  • 初始 prefix = "flower"。
  • 比较 prefix 和 "flow",发现 "flow" 不包含 "flower",开始逐渐缩短 prefix:
  • prefix = "flowe","flow" 仍不包含 "flowe"。
  • prefix = "flow","flow" 包含 "flow"。
  • 比较 prefix 和 "flight",发现 "flight" 不包含 "flow",开始逐渐缩短 prefix:
  • prefix = "flo","flight" 仍不包含 "flo"。
  • prefix = "fl","flight" 包含 "fl"。
  • 返回结果 prefix = "fl"。

来看一下题解效率:

还不错,beat 了 100% 的用户。

总结

这道题的关键是,搞清楚什么是公共前缀。公共前缀就是字符串数组中,所有字符串都包含的前缀。

巧妙的点是,我们可以字符串数组的第一个字符串作为初始的最长公共前缀,然后逐个将它与数组中的其他字符串进行比较。在比较的过程中,我们逐步缩短这个公共前缀,直到它同时是所有字符串的前缀。

大家可以感受一下这个过程,所用到的基础知识无外乎:

  • 字符串的 indexOf() 方法,用于判断一个字符串是否包含另一个字符串。这样就可以判断当前字符串是否包含当前最长公共前缀。
  • 字符串的 substring() 方法,用于截取字符串的子串。这样就可以缩短当前最长公共前缀。
  • 字符串的 isEmpty() 方法,用于判断字符串是否为空。为空说明就没有公共前缀了。

剩下的就是 for 循环和 while 循环了,for 循环用于遍历字符串数组,while 循环用于缩短当前最长公共前缀。

这些知识大家可以通过二哥的 Java 进阶之路来学习。

力扣链接:https://leetcode.cn/problems/longest-common-prefix/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

该题解目前只针对**二哥编程星球 **的球友开放,如果你也想一起打卡学习算法的话,扫下面的优惠券加入我们吧,星球目前 4300+ 人,定价 149 元,从当初的 99 元一路涨上来的,所以早就是优势,别再犹豫了。

(优惠券仅 300 张,数量有限)

一个人可以走得很快,但一群人才能走得更远。如果想去面中大厂的话,LeetCode 几乎是必刷的,二哥的 LeetCode 题解通俗易懂、图文并茂,理解给你举一反三的解题能力,冲鸭。

鲁迅曾说,每天刷一道二哥的 LeetCode 笔记,不但身体健康,而且精神抖擞。

技术派阅读地址:https://paicoding.com/column/7/1 4

  • 语雀专栏地址+密码可通过星球置顶帖查看:https://t.zsxq.com/15rEo9Pdu

  • 这道题可以说完全重写了,给出2道大家完全都能掌握的题解(hashmap 和 数组)。

  • 增加代码注释,这样大家更容易看懂并掌握题解;

  • 增加参考资料,这样大家可以从零基础直接开刷,减轻新手刷题的阻力;

  • 增加手绘图,这样大家更容易理解解题思路;

  • 增加 ACM 输入输出,这样大家可以在 Intellij IDEA 中进行调试;

  • 增加题解模拟,这样大家可以根据题解模拟整个题解过程,看完会有一种“哦哦”恍然大悟的感觉;

  • 图片上传至 OSS 并配合 CDN,提升大家在技术派网站中的阅读体感。

  • 另外,这一版本会作为 PDF 的终稿随后在星球进行发布。

题意

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

难度

简单

示例

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

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

分析

这道题最重要的是,搞清楚什么是公共前缀。公共前缀就是字符串数组中,所有字符串都包含的前缀。例如,字符串数组 ["flower","flow","flight"] 的最长公共前缀就是 fl。

一个很容易想到的办法,我们将数组中的第一个字符串作为初始的最长公共前缀,然后逐个将它与数组中的其他字符串进行比较。在比较的过程中,我们逐步缩短这个公共前缀,直到它同时是所有字符串的前缀。

①、初始前缀:假设整个数组的最长公共前缀就是数组中的第一个字符串,即 prefix = strs[0]。

②、遍历字符串数组:遍历字符串数组中的每一个字符串。对于每个字符串 strs[i],我们检查它是否包含当前的最长公共前缀 prefix。(可以跳过第一个,因为第一个就是它自己)

③、更新前缀

  • 如果当前字符串 strs[i] 包含前缀 prefix,我们就继续下一个字符串的比较。
  • 如果当前字符串 strs[i] 不包含前缀 prefix,我们就缩短前缀的长度,即 prefix = prefix.substring(0, prefix.length () - 1),然后再次检查。
  • 重复这个过程,直到 strs[i] 包含了 prefix 或 prefix 变成空字符串(即没有公共前缀)。

④、返回结果:最终 prefix 就是数组中所有字符串的最长公共前缀。

我们来看题解:

class Solution {
    if (strs == null || strs.length == 0) {            return "";        }
    // 以第一个字符串作为初始的最长公共前缀        String prefix = strs[0];        for (int i = 1; i < strs.length; i++) {            while (strs[i].indexOf(prefix) != 0) {                // 如果当前字符串不包含当前最长公共前缀,则前缀长度减一                prefix = prefix.substring(0, prefix.length() - 1);                if (prefix.isEmpty()) {                    return "";                }            }        }        return prefix;    }}

假设输入的字符串数组是 ["flower","flow","flight"]。

  • 初始 prefix = "flower"。
  • 比较 prefix 和 "flow",发现 "flow" 不包含 "flower",开始逐渐缩短 prefix:
  • prefix = "flowe","flow" 仍不包含 "flowe"。
  • prefix = "flow","flow" 包含 "flow"。
  • 比较 prefix 和 "flight",发现 "flight" 不包含 "flow",开始逐渐缩短 prefix:
  • prefix = "flo","flight" 仍不包含 "flo"。
  • prefix = "fl","flight" 包含 "fl"。
  • 返回结果 prefix = "fl"。

来看一下题解效率:

还不错,beat 了 100% 的用户。

总结

这道题的关键是,搞清楚什么是公共前缀。公共前缀就是字符串数组中,所有字符串都包含的前缀。

巧妙的点是,我们可以字符串数组的第一个字符串作为初始的最长公共前缀,然后逐个将它与数组中的其他字符串进行比较。在比较的过程中,我们逐步缩短这个公共前缀,直到它同时是所有字符串的前缀。

大家可以感受一下这个过程,所用到的基础知识无外乎:

  • 字符串的 indexOf() 方法,用于判断一个字符串是否包含另一个字符串。这样就可以判断当前字符串是否包含当前最长公共前缀。
  • 字符串的 substring() 方法,用于截取字符串的子串。这样就可以缩短当前最长公共前缀。
  • 字符串的 isEmpty() 方法,用于判断字符串是否为空。为空说明就没有公共前缀了。

剩下的就是 for 循环和 while 循环了,for 循环用于遍历字符串数组,while 循环用于缩短当前最长公共前缀。

这些知识大家可以通过二哥的 Java 进阶之路来学习。

力扣链接:https://leetcode.cn/problems/longest-common-prefix/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

该题解目前只针对**二哥编程星球 **的球友开放,如果你也想一起打卡学习算法的话,扫下面的优惠券加入我们吧,星球目前 4300+ 人,定价 149 元,从当初的 99 元一路涨上来的,所以早就是优势,别再犹豫了。

(优惠券仅 300 张,数量有限)

一个人可以走得很快,但一群人才能走得更远。如果想去面中大厂的话,LeetCode 几乎是必刷的,二哥的 LeetCode 题解通俗易懂、图文并茂,理解给你举一反三的解题能力,冲鸭。

鲁迅曾说,每天刷一道二哥的 LeetCode 笔记,不但身体健康,而且精神抖擞。

技术派阅读地址:https://paicoding.com/column/7/1 4

  • 语雀专栏地址+密码可通过星球置顶帖查看:https://t.zsxq.com/15rEo9Pdu

  • 这道题可以说完全重写了,给出2道大家完全都能掌握的题解(hashmap 和 数组)。

  • 增加代码注释,这样大家更容易看懂并掌握题解;

  • 增加参考资料,这样大家可以从零基础直接开刷,减轻新手刷题的阻力;

  • 增加手绘图,这样大家更容易理解解题思路;

  • 增加 ACM 输入输出,这样大家可以在 Intellij IDEA 中进行调试;

  • 增加题解模拟,这样大家可以根据题解模拟整个题解过程,看完会有一种“哦哦”恍然大悟的感觉;

  • 图片上传至 OSS 并配合 CDN,提升大家在技术派网站中的阅读体感。

  • 另外,这一版本会作为 PDF 的终稿随后在星球进行发布。

题意

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

难度

简单

示例

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

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

分析

这道题最重要的是,搞清楚什么是公共前缀。公共前缀就是字符串数组中,所有字符串都包含的前缀。例如,字符串数组 ["flower","flow","flight"] 的最长公共前缀就是 fl。

一个很容易想到的办法,我们将数组中的第一个字符串作为初始的最长公共前缀,然后逐个将它与数组中的其他字符串进行比较。在比较的过程中,我们逐步缩短这个公共前缀,直到它同时是所有字符串的前缀。

①、初始前缀:假设整个数组的最长公共前缀就是数组中的第一个字符串,即 prefix = strs[0]。

②、遍历字符串数组:遍历字符串数组中的每一个字符串。对于每个字符串 strs[i],我们检查它是否包含当前的最长公共前缀 prefix。(可以跳过第一个,因为第一个就是它自己)

③、更新前缀

  • 如果当前字符串 strs[i] 包含前缀 prefix,我们就继续下一个字符串的比较。
  • 如果当前字符串 strs[i] 不包含前缀 prefix,我们就缩短前缀的长度,即 prefix = prefix.substring(0, prefix.length () - 1),然后再次检查。
  • 重复这个过程,直到 strs[i] 包含了 prefix 或 prefix 变成空字符串(即没有公共前缀)。

④、返回结果:最终 prefix 就是数组中所有字符串的最长公共前缀。

我们来看题解:

class Solution {
    if (strs == null || strs.length == 0) {            return "";        }
    // 以第一个字符串作为初始的最长公共前缀        String prefix = strs[0];        for (int i = 1; i < strs.length; i++) {            while (strs[i].indexOf(prefix) != 0) {                // 如果当前字符串不包含当前最长公共前缀,则前缀长度减一                prefix = prefix.substring(0, prefix.length() - 1);                if (prefix.isEmpty()) {                    return "";                }            }        }        return prefix;    }}

假设输入的字符串数组是 ["flower","flow","flight"]。

  • 初始 prefix = "flower"。
  • 比较 prefix 和 "flow",发现 "flow" 不包含 "flower",开始逐渐缩短 prefix:
  • prefix = "flowe","flow" 仍不包含 "flowe"。
  • prefix = "flow","flow" 包含 "flow"。
  • 比较 prefix 和 "flight",发现 "flight" 不包含 "flow",开始逐渐缩短 prefix:
  • prefix = "flo","flight" 仍不包含 "flo"。
  • prefix = "fl","flight" 包含 "fl"。
  • 返回结果 prefix = "fl"。

来看一下题解效率:

还不错,beat 了 100% 的用户。

总结

这道题的关键是,搞清楚什么是公共前缀。公共前缀就是字符串数组中,所有字符串都包含的前缀。

巧妙的点是,我们可以字符串数组的第一个字符串作为初始的最长公共前缀,然后逐个将它与数组中的其他字符串进行比较。在比较的过程中,我们逐步缩短这个公共前缀,直到它同时是所有字符串的前缀。

大家可以感受一下这个过程,所用到的基础知识无外乎:

  • 字符串的 indexOf() 方法,用于判断一个字符串是否包含另一个字符串。这样就可以判断当前字符串是否包含当前最长公共前缀。
  • 字符串的 substring() 方法,用于截取字符串的子串。这样就可以缩短当前最长公共前缀。
  • 字符串的 isEmpty() 方法,用于判断字符串是否为空。为空说明就没有公共前缀了。

剩下的就是 for 循环和 while 循环了,for 循环用于遍历字符串数组,while 循环用于缩短当前最长公共前缀。

这些知识大家可以通过二哥的 Java 进阶之路来学习。

力扣链接:https://leetcode.cn/problems/longest-common-prefix/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

该题解目前只针对**二哥编程星球 **的球友开放,如果你也想一起打卡学习算法的话,扫下面的优惠券加入我们吧,星球目前 4300+ 人,定价 149 元,从当初的 99 元一路涨上来的,所以早就是优势,别再犹豫了。

(优惠券仅 300 张,数量有限)

一个人可以走得很快,但一群人才能走得更远。如果想去面中大厂的话,LeetCode 几乎是必刷的,二哥的 LeetCode 题解通俗易懂、图文并茂,理解给你举一反三的解题能力,冲鸭。

            知识星球
            
    
    
        
        扫码加入星球
        查看更多优质内容
    
    https://wx.zsxq.com/mweb/views/joingroup/join_group.html?group_id=15522885221412
014. 最长公共前缀
http://www.clxhxhhr.top/posts/2439/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。
文章目录