zoukankan      html  css  js  c++  java
  • 【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;
    }
    };

     

  • 相关阅读:
    android so壳入口浅析
    PySide图形界面开发(一)
    对一个伪装成微信的加固病毒的分析
    ZjDroid工具介绍及脱壳详细示例
    用pyinstaller把python代码打包成exe可执行文件
    Android下so注入汇总
    利用drozer进行Android渗透测试
    OWASP移动安全漏洞Top 10
    python with原理
    腾讯云
  • 原文地址:https://www.cnblogs.com/yinbiao/p/11311061.html
Copyright © 2011-2022 走看看