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