LeetCode:14.最长公共前缀

14.最长公共前缀

  • 编写一个函数来查找字符串数组中的最长公共前缀。
  • 如果不存在公共前缀,返回空字符串 “”。

方法一:纵向扫描(简单易想到的方法)

纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。
在这里插入图片描述

代码实现
string longestCommonPrefix(vector<string>& strs) {
        if (!strs.size()) {
            return "";
        }
        //先暂定strs[0]是最短的字符串,且上面有判断strs是否为空的部分,此时strs[0]一定存在
        int nLength = strs[0].size();    
        int nStrSize = strs.size();
        char cCurr;     //用于保存每次遍历对比的字符
        string sRes = "";
       
        for (int i = 0; i < nLength; i++)
        {
            cCurr = strs[0][i];
            for (size_t j = 1; j < nStrSize; j++)
            {
                //i == strs[j].size()判断当前索引是否超出字符串的长度,避免越界
                if (i == strs[j].size() || cCurr != strs[j][i]) {
                    return sRes;
                }
            }
            sRes += cCurr;
        }
        return sRes;
    }

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

空间复杂度 O ( 1 ) O(1) O(1)。使用的额外空间复杂度为常数。


方法二:横向扫描(LeetCode题解)

L C P ( S 1 … S n ) LCP(S_1 \dots S_n) LCP(S1Sn) 表示字符串 S 1 … S n S_1 \dots S_n S1Sn 的最长公共前缀。可以得到一下结论:

L C P ( S 1 … S n ) = L C P ( L C P ( L C P ( S 1 , S 2 ) , S 3 ) , … S n ) LCP(S_1 \dots S_n)=LCP(LCP(LCP(S_1,S_2),S_3),\dots S_n) LCP(S1Sn)=LCP(LCP(LCP(S1,S2),S3),Sn)

基于该结论,可以得到一种查找字符串数组中的最长公共前缀的简单方法。依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。

在这里插入图片描述

如果在尚未遍历完所有的字符串时,最长公共前缀已经是空串,则最长公共前缀一定是空串,因此不需要继续遍历剩下的字符串,直接返回空串即可。

代码实现
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if (!strs.size()) {
            return "";
        }
        string prefix = strs[0];
        int count = strs.size();
        for (int i = 1; i < count; ++i) {
            prefix = longestCommonPrefix(prefix, strs[i]);
            if (!prefix.size()) {
                break;
            }
        }
        return prefix;
    }

    string longestCommonPrefix(const string& str1, const string& str2) {
        int length = min(str1.size(), str2.size());
        int index = 0;  //记录公共前缀的长度
        while (index < length && str1[index] == str2[index]) {
            ++index;
        }
        return str1.substr(0, index);   //从其中一个字符串中获取index长度的子集就是公共前缀
    }
};

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

该方法涉及了递归的思想,但是之前很少应用这种方法,只能理解还未掌握,还要努力呀!

LeetCode还提供了其他两种方法,有兴趣的时候可以学习学习。14.最长公共前缀题解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值