经常刷算法题的小伙伴对于 “最长”,“公共” 两个词一定不陌生。与此相关的算法题目实在是太多了 !!!
之前的 「动态规划」 专题系列文章中就曾讲解过两道相关的题目:最长公共子序列 和 最长回文子序列 。
关注公众号,在 主页合集 中可以查看更多相关文章。
今天我们继续来学习一道较为简单的 “最长公共” 问题。
14. 最长公共前缀
编写一个函数来查找 字符串数组 中的 最长公共前缀 。
如果不存在公共前缀,返回 空字符串""
。
示例 1:
输入: strs = [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: strs = [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
- 提示:
- 1 <= strs.length <= 200
- 0 <= strs[i].length <= 200
- strs[i] 仅由小写英文字母组成
思路分析
这道题的处理办法有很多:横向对比、纵向对比、字典树、分治、二分查找 等等(能想到后两种方法的一定不是一般人哈哈哈)。
这里采用最简单,也是最容易想到的方法 —— 横向对比 ,即直接两两依次对比。
横向对比 :
将字符串数组中的 第一个 字符串元素做为 基准元素 。
依次遍历字符串数组,将数组中的每个字符串都与 基准元素作对比 ,求出此时的字符串与基准元素的最长公共前缀的下标。
取所有下标的最小值,即为最长公共前缀的长度。
代码
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);
}
代码解释
- 注意边界条件的判断:若字符串数组本身为空或其长度为 0 ,可直接返回 空串 。
- 若在遍历过程中,最长公共前缀的长度最小值已经为 0 了,则说明答案一定为空串,可以提前结束,直接返回。
前面的算法文章,更新了许多 专题系列 。包括:滑动窗口、动态规划、加强堆、二叉树递归套路 等。
接下来的一段时间,将持续 「力扣高频题」 系列文章,想刷 力扣高频题 的小伙伴可以关注一波哦 ~
~ 点赞 ~ 关注 ~ 星标 ~ 不迷路 ~!!!
回复「ACM紫书」获取 ACM 算法书籍 ~
回复「算法导论」获取 算法导论第3版 ~
在看 + 转发
让你的小伙伴们一起来学算法吧!!