NC55 最长公共前缀(字符串)

描述

给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。
输入:[“abca”,“abc”,“abca”,“abc”,“abcc”]
返回值:“abc”

解题思路

方法一:子串纵向查找

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

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

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        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列字符或者子串为i时
                    return strs[0].substr(0,i);
            }
        }
        return strs[0];
    }
};

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

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

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<strs.size() && a[i]==b[i];i++);
        return a.substr(0,i);
    }
};

复杂度分析:
时间复杂度:O(nlogn),其中n 是字符串的数量,排序算法时间复杂度O(nlogn)。
空间复杂度:O(1)。额外空间复杂度为常数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值