​LeetCode刷题实战14: 最长公共前缀

简介: 算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做最长公共前缀 ,我们先来看题面:

https://leetcode-cn.com/problems/longest-common-prefix/

Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string "".


题意

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

样例

示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

题解


解法一


这种解法是暴力循环法,从题目可知:最长公共前缀的最长长度一定是字符串数组中长度最短哪个字符串。

  1. 首先找出长度最短的字符串str,加入str="abcf"。
  2. 依次对'abcf'、'abc'、'ab'、'a'进行筛选,判断哪个是所有其他字符串的前缀。
public String longestCommontPrefix6(String[] strs) {
    if(strs.length == 0) {
        return "";
    }
    int min = Integer.MAX_VALUE;
    for(String str : strs) {
        min = Math.min(min, str.length());
    }
    int low = 1;
    int high = min;
    while(low <= high) {
        int middle = (low + high)/2;
        if(this.isCommontPrefix(strs, middle)) {
            low = middle + 1;
        } else {
            high = middle - 1;
        }
    }
    return strs[0].substring(0, (low + high)/2);
}
public boolean isCommontPrefix(String[] strs, int length) {
    String tmp = strs[0].substring(0, length);
    for (int i=0; i<strs.length; i++) {
        if(!strs[i].startsWith(tmp)) {
            return false;
        }
    }
    return true;
}

解法二

这种方法称之为水平扫描法,用一张图来表示其具体过程如下:

51.jpg

首先假设最长前缀result=str[0], 遍历字符串数组,依次与result做比较,找出其最长前缀,然后更新result,再进行下一次比较。

public String longestCommonPrefix3(String[] strs) {
    if(strs.length == 0) {
        return "";
    }
    String result = strs[0];
    for(int i=0; i<strs.length; i++) {
        while(strs[i].indexOf(result) != 0) {
            result = result.substring(0, result.length()-1);
            if(result.length() == 0) {
                return "";
            }
        }
    }
    return result;
}

解法三


利用二分法的思想

  1. 找出最短的字符串记为m;
  2. 对字符串m进行二分,分割点记为mid,用tmp表示m[low...high]。
  3. 如果tmp为所有字符串的前缀,则mid右移,否则左移,直到low>high。
    代码如下:
public String longestCommontPrefix6(String[] strs) {
    if(strs.length == 0) {
        return "";
    }
    int min = Integer.MAX_VALUE;
    for(String str : strs) {
        min = Math.min(min, str.length());
    }
    int low = 1;
    int high = min;
    while(low <= high) {
        int middle = (low + high)/2;
        if(this.isCommontPrefix(strs, middle)) {
            low = middle + 1;
        } else {
            high = middle - 1;
        }
    }
    return strs[0].substring(0, (low + high)/2);
}
public boolean isCommontPrefix(String[] strs, int length) {
    String tmp = strs[0].substring(0, length);
    for (int i=0; i<strs.length; i++) {
        if(!strs[i].startsWith(tmp)) {
            return false;
        }
    }
    return true;
}

今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。


相关文章
|
2月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
82 2
|
1天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
1天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
算法
LeetCode第14题最长公共前缀
该文章介绍了 LeetCode 第 14 题最长公共前缀的解法,通过取一个字符串作为基准,一列一列字符比较来找出最长公共前缀,时间复杂度为 O(m * n),同时提到也可使用二分查找法,但代码复杂度会上升。
LeetCode第14题最长公共前缀
|
2月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
39 3
|
2月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
17 3
|
2月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
18 1
|
2月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
19 1
|
2月前
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
16 1
|
2月前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
18 0
【Leetcode刷题Python】73. 矩阵置零