zoukankan      html  css  js  c++  java
  • 14. 最长公共前缀

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

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

    示例 1:

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

    示例 2:

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

    提示:

    0 <= strs.length <= 200
    0 <= strs[i].length <= 200
    strs[i] 仅由小写英文字母组成
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/longest-common-prefix
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这道题相对简单,有几个思路:

    从头到位,每一个字符判断

    这个是最简单也最容易想到的,就是从第一个字符开始,判断每一个字符串的第一个字符是否一样,如果一样,就继续下一个,如果不一样,就结束,如果有的字符串已经到最后一位,也结束。

    class Solution {
    public:
        string longestCommonPrefix(vector<string>& strs) {
            string sret;
            int i = 0;
            char p = 0;
            bool bret = true;
            if(strs.empty())
            {
                bret = false;
            }
            while(bret)
            {
                p = 0;
                for(auto& iter : strs)
                {
                    if(iter.size() <= i)
                    {
                        bret = false;
                        break;
                    }
                    else if(p == 0)
                    {
                        p = iter[i];
                    }
                    else if(p != iter[i])
                    {
                        bret = false;
                        break;
                    }
                }
                i++;
                if(bret)
                {
                    sret = sret + p;
                }
            }
            return sret;
        }
    };
    

    每个字符串单独判断

    这个就是从头到尾,每个字符串与得到的前面的公共前缀比较,第一组就是前两个比较,得到公共前缀,然后用公共前缀和第三个比较,以此类推。

    class Solution {
    public:
        string longestCommonPrefix(vector<string>& strs) {
            string sret;
            bool bfirst = true;
            for(auto& iter : strs)
            {
                if(bfirst)
                {
                    bfirst = false;
                    sret = iter;
                    continue;
                }
                int len = sret.size();
                if(len > iter.size())
                {
                    len = iter.size();
                }
                if(len > 0)
                {
                    sret = sret.substr(0, len);
                    for(int i = 0; i < len; i++)
                    {
                        if(sret[i] != iter[i])
                        {
                            sret = sret.substr(0, i);
                            break;
                        }
                    }
                }
                else
                {
                    sret = "";
                }
                if(sret.empty())
                {
                    break;
                }
            }
            return sret;
        }
    };
    

    二分法

    这种方法就是把字符串数组按照二分法,然后每一半单独查找公共前缀,最后再对比两遍的结果。

    另一种二分法

    这种二分法是先找到最小长度的字符串,比如是n,然后按照二分法,先查找n/2的位置是否是公共前缀,如果是,就再找后面的,如果不是就再找前面的。

    版权声明:本文版权归作者所有,如需转载,请标明出处

  • 相关阅读:
    前沿技术解密——VirtualDOM
    Ques核心思想——CSS Namespace
    Unix Pipes to Javascript Pipes
    Road to the future——伪MVVM库Q.js
    聊聊CSS postproccessors
    【译】十款性能最佳的压缩算法
    Kafka Streams开发入门(9)
    Kafka Streams开发入门(8)
    【译】Kafka Producer Sticky Partitioner
    【译】99th Percentile Latency at Scale with Apache Kafka
  • 原文地址:https://www.cnblogs.com/studywithallofyou/p/14518526.html
Copyright © 2011-2022 走看看