C++ 寻找最长公共前缀 [LeetCode 14]

题目:

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

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

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


思路:

纵向:从下标0开始,判断每一个字符串的下标0,判断是否全部相同。直到遇到不全部相同的下标。时间性能为O(n*m)。

横向:前两个字符串找公共子串,将其结果和第三个字符串找公共子串……直到最后一个串。时间性能为O(n*m)。

第一次提交时我才用的是横向比较,代码如下:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.size()==0) return "";
        if(strs.size()==1||strs[0]=="") return strs[0];
        string tempString=strs[0];
        string  samePre="";
        for(int i=1;i<strs.size();i++)
        {
            samePre="";
            for(int j=0;j<strs[i].size()&&j<tempString.size();j++)
            {
                if(strs[i][j]==tempString[j])
                    samePre+=tempString[j];
                else break;
            }
            if(samePre=="")
                {
                    tempString="";
                    break;
                }
            else
                tempString=samePre;
        }
        return tempString;
    }
};

运行4ms,内存8.8M,双80%+的结果,循环嵌套耗费了大量的时间,而且开辟了两个string类型的内存空间,说明这个类暴力算法没有靠近最优解。

有网友提供了一种字典排序的思想,即这些字符串排序后,若有公共前缀,只需要比较第一个和最后一个字符串的公共前缀即可,类似夹逼法:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
       sort(strs.begin(),strs.end());
       string &first=strs.front();
       string &last=strs.back();
       int i=0;
       while(i<last.size()&&i<first.size()&&first[i]==last[i])
       {
           ++i;
       }
       return string(first.begin(),first.begin()+i);
    }
};

最好情况是0ms,内存8.7M,几乎双百的结果,时间复杂度主要由sort函数决定

posted @ 2021-09-07 14:18  北陌南旬  阅读(231)  评论(0)    收藏  举报