题解 | #最长公共前缀#

最长公共前缀

http://www.nowcoder.com/practice/28eb3175488f4434a4a6207f6f484f47

题意思路:

题目给出长度为n的子串,找出子串中最长的公共前缀。

方法一:子串纵向查找

纵向遍历非常的直观,如下图所示,将每个字符串分别依次遍历每一列的元素,比较相同列上字符是否相同,若相同则比较下一个子串,若不同则最长公共前缀为上个遍历过的公共前缀。

复杂度分析:
时间复杂度:O(mn),其中n 是字符串的数量,m 是字符串数组中的字符串的平均长度。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。

空间复杂度:O(1)。额外空间复杂度为常数。

演示子串纵向查找方式:
算法演示图

class Solution {
public:

    string longestCommonPrefix(vector<string>& strs) {
        // write code here
        if(!strs.size())return "";//特判若子串为空则返回空值
        for(int i=0;i<strs[0].size();i++){//枚举第一个子串的每个字符
            for(int j=1;j<strs.size();j++){//枚举后面所有子串
                if(strs[0][i]!=strs[j][i]||i==strs[j].size()){//比较后面所有子串的第i列字符和第j个子串的长度
                    return strs[0].substr(0,i);//若字符不相同或者长度为最小则返回最长公共前缀
                }
            }
        }
        return strs[0];
    }
};

方法二:排序后子串纵向查找

先将所以子字符串按照字典序的大小排序,想要得到最长公共前缀,只需要将字典序最小的子串A与字典序最大的B比较相同部分,得到的最长公共前缀就是所有子串的公共前缀。

复杂度分析:

时间复杂度:O(nlogn),其中n 是字符串的数量,排序算法时间复杂度O(nlogn)。

空间复杂度:O(1)。额外空间复杂度为常数。

class Solution {
public:

    string longestCommonPrefix(vector<string>& strs) {
         if(!strs.size())return "";
         sort(strs.begin(),strs.end());//按照字典序排序得到所有子串顺序
         string a=strs.front(),b=strs.back();//枚举第一个最小的子串和最后一个最大的子串
         int i=0;
         for(i=0;i<a.size()&&a[i]==b[i];i++);//若字符相同则继续比较否则返回最长公共前缀串
         return a.substr(0,i);

    }
};
全部评论
方法二:排序后子串纵向查找 时间复杂度应该是o(n*log(n)*len)叭,n为字符串的数量,len为字符串的平均长度排序时就要对字符串进行比较,而字符串又是有长度的,每次比较都是在进行遍历。 从感性的角度看,一个字符串往往不止需要一次与其它字符串进行比较,相比方法一,方法二的时间复杂度是要更大的。
1 回复 分享
发布于 2022-10-05 16:52 湖南
方法二在对字符串按字典序排序,底层原理是按位计算字符串的幂和,它与字符串长度有关
点赞 回复 分享
发布于 2023-04-22 08:44 湖北

相关推荐

迟缓的斜杠青年巴比Q了:简历被投过的公司卖出去了,我前两天遇到过更离谱的,打电话来问我有没有意向报班学Java学习,服了,还拿我学校一个学长在他们那报班学了之后干了华为OD当招牌
点赞 评论 收藏
分享
05-12 17:28
已编辑
门头沟学院 硬件开发
ldf李鑫:不说公司名祝你以后天天遇到这样的公司
点赞 评论 收藏
分享
评论
31
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务