【LeetCode】最长公共前缀【二分】

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

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

说明:

所有输入只包含小写字母 a-z 。

来源:力扣(LeetCode)
链接:
https://leetcode-cn.com/problems/longest-common-prefix

 

分析:

方法1:找到最短的的字符串,然后拿最短字符串的每个字母去所有字符串中验证(验证该字符在每个字符串中都存在)

时间复杂度:O(S),S为所有字符串中字符数量的总和

最好情况:O(N*minL),N为字符串数量,minl为最短字符串的数量

最坏情况:O(N*M)(N个长度为M的相同字符串)

空间复杂度:O(1)

 

方法2:找到最短字符串,然后对最短字符串的长度进行二分,每次得到长度mid,就去验证长度mid是否符合要求(验证方法:看看所有字符串的前mid个字符是否相同)

时间复杂度:O(S*log(minl)),S为所有字符串的字符数量,minl为最短字符串的长度

空间复杂度:O(1)

 

方法1:

复制代码
class Solution {
public:
string longestCommonPrefix(vector<string>& v)
{
    int n=v.size();
    if(n==0)
        return "";
    if(n==1)
        return v[0];
    int minl=INT_MAX;
    int index=0;
    for(int i=0;i<n;i++)
    {
        int k=v[i].size();
        if(k<minl)
        {
            minl=k;
            index=i;
        }
    }
    string ans;
    for(int j=0;j<=minl;j++)
    {
        for(int i=0;i<n;i++)
        {
            if(v[i][j]==v[index][j])
                continue;
            else
                return ans;
        }
        ans+=v[index][j];
    }
    return ans;
}
};
复制代码

方法2:

复制代码
class Solution {
public:
string longestCommonPrefix(vector<string>& v)
{
    int n=v.size();
    if(n==0)
        return "";
    if(n==1)
        return v[0];
    if(n==2&&v[0]==v[1])
        return v[0];
    int minl=v[0].length();
    for(int i=1;i<n;i++)
    {
        int k=v[i].size();
        if(v[i][0]!=v[i-1][0])
            return "";
        if(k==0)
        {
            return "";
        }
        if(k<minl)
        {
            minl=k;
        }
    }
    string ans=v[0].substr(0,1);
    int start=0;
    int end=minl;
    while(start<=end)
    {
        int mid=(start+end)/2;
        string str=v[0];
        
        int flag=1;
        for(int i=1;i<n;i++)
        {
            if(str.substr(0,mid)!=v[i].substr(0,mid))
            {
                flag=0;
                break;
            }
        }
        if(flag==1)
        {
            start=mid+1;
            ans=str.substr(0,mid);
        }else
        {
            end=mid-1;
        }
    }
    return ans;
}
};
复制代码

 

posted @   西*风  阅读(289)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2018-08-06 poj 2253 Frogger 最小瓶颈路(变形的最小生成树 prim算法解决(需要很好的理解prim))
2018-08-06 UVALive - 6837 Kruskal+一点性质(暴力枚举)
2018-08-06 uva 10369 Arctic Network (最小生成树加丁点变形)
2018-08-06 UVALive - 2515 (最小生成树 kruskal)
2018-08-06 UVA - 11987 Almost Union-Find(带删除的并查集)
2018-08-06 UVA - 1160(简单建模+并查集)
2018-08-06 POJ 1182 食物链(经典带权并查集 向量思维模式 很重要)
点击右上角即可分享
微信分享提示